Даже вычисление псевдообратной матрицы необязательно нуждается в обратимой матрице, я использую неособую матрицу для тестирования. Когда я использую только armadillo, ответ возвращается без ошибок. Я использую следующий код:pinv return svd не удалось при использовании mex + armadillo в matlab
#include <iostream>
#include <armadillo>
using namespace std;
using namespace arma;
int main(int argc, char** argv)
{
mat A,B;
A << 1 << 2 << endr << 3 << 4 << endr;
A.print("A:");
B = pinv(A);
B.print("B:");
return 0;
}
Этот код был адаптирован к MEX (спасибо @ Клаас-Ролены для этого):
#include "armaMex.hpp"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
mat A = conv_to<mat>::from(armaGetPr(prhs[0],true));
plhs[0] = armaCreateMxMatrix(A.n_rows,A.n_cols, mxDOUBLE_CLASS, mxREAL);
armaSetPr(plhs[0],conv_to<mat>::from(pinv(A)));
}
Но при тестировании предыдущей матрицы, она возвращает svd- не смогли. Кто-то может помочь, почему это происходит, даже если матрица неосознана. Вышеприведенный код работает, когда я изменяю pinv() для inv(), но для моего приложения мне нужно, чтобы он работал с pinv().
Пробовал код как 'inv()', так и 'pinv()', и он работал нормально. Я использую Armadillo 6.7, Visual Studio 2015 и Matlab 2016a на Windows10. –
@ClaesRolen Я использую Ubuntu 16 здесь. Я нашел аналогичный вопрос на форуме Matlab, и теперь я могу запустить код без проблем. Перед запуском matlab просто были установлены некоторые системные переменные. Еще раз, спасибо за ответ! –