2016-09-20 8 views
0

Даже вычисление псевдообратной матрицы необязательно нуждается в обратимой матрице, я использую неособую матрицу для тестирования. Когда я использую только 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().

+1

Пробовал код как 'inv()', так и 'pinv()', и он работал нормально. Я использую Armadillo 6.7, Visual Studio 2015 и Matlab 2016a на Windows10. –

+0

@ClaesRolen Я использую Ubuntu 16 здесь. Я нашел аналогичный вопрос на форуме Matlab, и теперь я могу запустить код без проблем. Перед запуском matlab просто были установлены некоторые системные переменные. Еще раз, спасибо за ответ! –

ответ

1

Чтобы использовать pinv() на MATLAB без ошибок, выполните следующие действия:

В командной строке установите следующие переменные:

export BLAS_VERSION="/usr/lib/libblas.so" 
export LAPACK_VERSION="/usr/lib/liblapack.so" 

Выполнить MATLAB и скомпилировать MEX код:

mex prog.cpp -larmadillo -llapack -lblas 

Это работает на Ubuntu 16.

 Смежные вопросы

  • Нет связанных вопросов^_^