Экспоненциальная матрица с броненосцем

В настоящее время я разрабатываю свой собственный код C++/Mex и Matlab, но мой проект становится большим, и я подумываю о переходе на подходящую библиотеку линейной алгебры. Я читал очень хорошие вещи о Armadillo, но я не могу найти несколько важных функций, которые мне нужны для моего проекта.

Я понимаю, что Armadillo ссылается на библиотеки LAPACK и BLAS, но я не смог найти экспоненциальную функцию матрицы в API Armdaillo, ни в функциях LAPACK.

Может ли кто-нибудь сказать мне, есть ли надстройка для вычисления матричных экспонент с помощью Armadillo? Если это так, краткий пример кода был бы очень признателен.


person Jonathan H    schedule 14.06.2014    source источник
comment
Планируете ли вы полностью перейти на C++? Из формулировки вашего вопроса неясно - у Matlab есть экспоненциальная матрица, и вы упоминаете о разработке функций Mex C++.   -  person paisanco    schedule 14.06.2014
comment
@bogeyc Я работаю как с Matlab, так и с C ++ (я студент-исследователь). Часть C++ по существу независима от Matlab, но я пишу функции Mex-оболочки, которые будут вызываться из Matlab для повышения скорости обработки или для обработки, требующей очень больших объемов памяти. Переключение на библиотеку будет для части C++, а матрицы Armadillo могут обрабатывать матрицы, выделенные с помощью Matlab (часть причины, по которой я рассматриваю это).   -  person Jonathan H    schedule 14.06.2014


Ответы (3)


Матричная экспонента - это то, что есть в Matlab. Поэтому Octave реализовал это. Поэтому другие проекты свободного программного обеспечения посмотрели на то, что есть в Octave, и реализовали это заново, позаимствовав эту реализацию.

Я много работаю с R и Armadillo через пакет RcppArmadillo (для которого Я соавтор). В одной из недавних работ мне понадобился expm(), и я позаимствовал его для использования Armadillo из R-пакет exmp.

Код выглядит следующим образом:

arma::mat expm(arma::mat x) {
    arma::mat z(x.n_rows, x.n_cols);
    (*expmat)(x.begin(), x.n_rows, z.begin(), Ward_2);
    return z;
}

но это, конечно, зависит от того факта, что я получаю указатель функции на expmat из R пример пакета. Полный файл находится здесь, на Github, в котором перечисление Ward_2 указано как хорошо.

person Dirk Eddelbuettel    schedule 14.06.2014
comment
Спасибо, на данный момент я использую mexCallMATLAB( 1, &_expmat, 1, &_mxmat, "expm" ); с Matlab, но он довольно медленный. Я тоже мог бы сохранить тот же трюк, но мне было интересно, есть ли лучший способ. - person Jonathan H; 14.06.2014
comment
Да, мы можем вернуться в R как но предпочитаем избегать этого, насколько это возможно. Так что в худшем случае, я думаю, вам, возможно, придется пройти весь путь и реализовать expm в Armadillo. Что вы могли бы внести свой вклад в растущий объем работ Конрада :) - person Dirk Eddelbuettel; 14.06.2014
comment
Хорошо, тогда я мог бы сделать это, когда у меня будет больше времени, я вижу повторяющиеся вопросы о матричных экспоненциалах, и ответ почти всегда таков: «Девятнадцать сомнительных способов»… и «Сделай сам». На данный момент я мог бы просто использовать свой трюк с Matlab, но большое спасибо за то, что поделились своим опытом! :) - person Jonathan H; 14.06.2014

Это было добавлено как expmat в последнюю версию, см. http://arma.sourceforge.net/docs.html#expmat

person Jonathan H    schedule 23.11.2014

Вот порт реализации c/c++ Джона Беркардта одной из 19 сомнительных для Armadillo...

https://gist.github.com/tesch1/0c03e43885cd66eceabe

person tesch1    schedule 06.11.2014
comment
Хорошо знать! Я проверю это, когда у меня будет минутка, спасибо - person Jonathan H; 06.11.2014