在matlab中使用mex + armadillo时,pinv返回svd失败

时间:2016-09-20 01:40:32

标签: matlab matrix linear-algebra 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(感谢@ claes-rolen):

#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-failed。有人可以帮助解决这个问题的原因,即使矩阵是非单数的。当我为inv()更改pinv()时,上面的代码有效,但对于我的应用程序,我需要使用pinv()。

1 个答案:

答案 0 :(得分: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。