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

Posted

技术标签:

【中文标题】在matlab中使用mex + armadillo时pinv返回svd失败【英文标题】:pinv return svd failed when use mex + armadillo in matlab 【发布时间】:2016-09-20 01:40:32 【问题描述】:

即使是伪逆矩阵计算也不一定需要可逆矩阵,我用的是非奇异矩阵来测试。当我只使用犰狳时,会返回没有错误的答案。我正在使用下一个代码:

#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。有人可以帮助为什么会发生这种情况,即使矩阵不是奇异的。当我将 pinv() 更改为 inv() 时,上面的代码有效,但对于我的应用程序,我需要它与 pinv() 一起使用。

【问题讨论】:

尝试了inv()pinv() 的代码,它运行良好。我在 Windows10 上使用 Armadillo 6.7、Visual Studio 2015 和 Matlab 2016a。 @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。

【讨论】:

以上是关于在matlab中使用mex + armadillo时pinv返回svd失败的主要内容,如果未能解决你的问题,请参考以下文章

Matlab + Armadillo 和逆矩阵崩溃

犰狳 + Matlab Mex 段错误

编译 Mex 和 Armadillo 的困难

MATLAB 操作的 Armadillo 等价物

如何在从 Matlab 调用的 mex 函数中使用 Matlab 引擎

mex 文件崩溃,如何在 matlab 中使用 MATLAB_MEM_MGR?