[英]pinv return svd failed when use mex + armadillo in matlab
即使是偽逆矩陣計算也不一定需要可逆矩陣,我正在使用非奇異矩陣進行測試。 當我只使用犰狳時,返回的答案沒有錯誤。 我正在使用下一個代碼:
#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失敗。 即使矩陣非奇異,也有人可以幫助解釋為什么會發生這種情況。 當我將inv()的pinv()更改時,上面的代碼有效,但是對於我的應用程序,我需要將其與pinv()一起使用。
要在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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.