【问题标题】:pinv return svd failed when use mex + armadillo in matlab在matlab中使用mex + armadillo时pinv返回svd失败
【发布时间】: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 之前设置了一些系统变量。再来一次,谢谢你的回答!

标签: matlab matrix linear-algebra mex armadillo


【解决方案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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多