2016-09-20 66 views
0

即使是僞逆矩陣計算也不一定需要一個可逆矩陣,我正在使用一個非奇異矩陣來測試。當我只使用犰狳時,答案無誤地被返回。我用下面的代碼:pinv return svd在matlab中使用mex + armadillo時失敗

#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-失敗。有人可以幫助爲什麼會發生這種情況,即使矩陣非單一。上面的代碼在我爲inv()更改pinv()時起作用,但對於我的應用程序,我需要它與pinv()一起工作。

+1

嘗試你的代碼'inv()'和'pinv()'並且它工作正常。我在Windows10上使用Armadillo 6.7,Visual Studio 2015和Matlab 2016a。 –

+0

@ClaesRolen我在這裏使用Ubuntu 16。我在matlab的論壇上發現了一個類似的問題,我現在可以毫無問題地運行代碼。在運行matlab之前,它只是設置了一些系統變量。再一次,謝謝你的回答! –

回答

1

要在MATLAB使用PINV()沒有錯誤,按照下面的步驟:

在命令行上,設置下一個變量:

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

執行MATLAB和編譯MEX代碼:

mex prog.cpp -larmadillo -llapack -lblas 

這適用於Ubuntu 16.