2016-09-20 5 views
0

의사 역행렬 계산에도 반드시 역전 행렬이 필요하지는 않습니다. 테스트하기 위해 비특이적 행렬을 사용하고 있습니다. armadillo 만 사용하면 대답은 오류없이 반환됩니다. 이전 매트릭스 테스트 할 때matvab에서 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; 
} 

(이 주셔서 감사합니다 @ CLAES - 롤렌)를 MEX하기 : 나는 다음 코드를 사용하고 있습니다 실패한. 매트릭스가 비특이적이라 할지라도 누군가가 이런 일이 일어나는 이유를 도울 수 있습니다. 위의 코드는 inv()에 대해 pinv()를 변경할 때 작동하지만 내 응용 프로그램에서는 pinv()로 작동해야합니다. MATLAB을 실행

export BLAS_VERSION="/usr/lib/libblas.so" 
export LAPACK_VERSION="/usr/lib/liblapack.so" 

및 MEX 코드를 컴파일 : : 다음 변수를 설정, 명령 줄에서

:

mex prog.cpp -larmadillo -llapack -lblas 
+1

코드를'inv()'와'pinv()'모두 시도해 보았지만 정상적으로 작동했습니다. 나는 Windows10에서 Armadillo 6.7, Visual Studio 2015 및 Matlab 2016a를 사용합니다. –

+0

@ClaesRolen 여기에서 우분투 16을 사용하고 있습니다. 나는 matlab의 포럼에서 비슷한 질문을 발견했다. 이제 문제없이 코드를 실행할 수있다. 그냥 matlab을 실행하기 전에 몇 가지 시스템 변수를 설정했다. 한 번 더 대답 해줘서 고마워! –

답변

1

다음 단계를 수행 오류없이 MATLAB에 pinv()를 사용하려면

이것은 우분투 16에서 작동합니다.