2016-09-20 8 views
0

疑似逆行列計算でも可逆行列は必ずしも必要ではありませんが、私は非特異行列を使ってテストしています。私がアルマジロだけを使うと、答えはエラーなく返されます。matlabでmex + armadilloを使用したときにpinv return svdが失敗しました

#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-を返します。

#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でするようになった:私は、次のコードを使用しています失敗しました。行列が非単数であっても、なぜこれが起こるのかを誰かが助けることができます。上記のコードは、inv()のpinv()を変更するときに機能しますが、私のアプリケーションではpinv()で動作する必要があります。エラーなしMATLABに

+1

あなたのコードを 'inv()'と 'pinv()'の両方で試してみました。私はArmadillo 6.7、Visual Studio 2015、Matlab 2016aをWindows10で使用しています。 –

+0

@ClaesRolen私はここでUbuntu 16を使用しています。私はmatlabのフォーラムで同様の質問を発見し、問題なくコードを実行できるようになりました。 matlabを実行する前にシステム変数を設定するだけでした。もう一度、答えをありがとう! –

答えて

1

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で動作します。

関連する問題