即使伪逆矩阵计算也不一定需要可逆矩阵,我使用非奇异矩阵进行测试。当我只使用犰狳时,答案会毫无错误地返回。我正在使用下一个代码:
#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()。
答案 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。