2016-09-15 8 views
0

私はmexファイルでDGESVを使用して線形システムを解こうとしています。 2x2システムの場合、mexファイルは正常に動作し、エラーは発生しませんでしたが、システムが2より大きい場合、MATLABシステムエラーダイアログボックスのapperasが発生し、内部問題が発生し、終了する必要があります。 Imはコンパイルラインは、64ビットのウィンドウ10とインテル作曲XE 2013Matlab mexでDGESVを使用する際のエラー

にMatlabのr2016aを使用して:

mex -lmwlapack *.F 

次のようにコードがある:

 #include "fintrf.h" 

C  Gateway subroutine 
     subroutine mexfunction(nlhs, plhs, nrhs, prhs) 

C  Declarations 
     implicit none 

C  mexFunction arguments: 
     mwPointer plhs(*), prhs(*) 
     integer nlhs, nrhs 

C  Function declarations: 
     mwPointer mxGetPr 
     mwPointer mxCreateDoubleMatrix 
     mwPointer mxGetM 

C  Pointers to input/output mxArrays: 
     mwPointer pr_A, pr_B, pr_C 

C  Array information: 

     mwPointer sizea 
     real*8 , allocatable :: A(:,:) 
    +  ,B(:,:),C(:,:) 

C  Get the size of the input array. 
     sizea = mxGetM(prhs(1)) 

     allocate(A(sizea,sizea),B(sizea,1)) 
     allocate(C(sizea,1)) 

C  Create Fortran array from the input argument. 
     pr_A = mxGetPr(prhs(1)) 
     pr_B = mxGetPr(prhs(2)) 

     call mxCopyPtrToReal8(pr_A,A,sizea**2) 
     call mxCopyPtrToReal8(pr_B,B,sizea) 

C  Create matrix for the return argument. 
     plhs(1) = mxCreateDoubleMatrix(sizea, 1, 0) 
     pr_C = mxGetPr(plhs(1)) 

C  Call the computational routine. 
     Call SolveLS(A,B,C,sizea) 

     call mxCopyReal8ToPtr(C,pr_C,sizea) 

     return 
     end 

C  Computational routine 
     subroutine SolveLS(A,B,C,sizea) 

     integer*4 :: sizea,pivot(sizea),info 
     real*8 :: A(sizea,sizea),B(sizea,1), C(sizea,1) 

     call DGESV(sizea, 1,A,sizea,pivot,B,sizea,info) 
     C=B 
     return 
     end subroutine SolveLS 
+2

で見つけることができます。起こっていることを説明する。エラーメッセージはありますか?どれが正確?間違った結果?どのオペレーティングシステムを使用していますか? –

+0

質問に感謝や署名を入れないでください。ここでは期待していません。あなたの問題を簡潔な方法で説明してください。 –

答えて

1

このようなシステムエラー通常、メモリの割り当てが不良でメモリが壊れていることを示します。 MATLABがメモリの割り当てと解放を処理することを可能にするmxMallocの代わりに、標準のFortran割り当て関数を使用していることがわかりました。 mxMallocのメモリは、MEX関数呼び出しの終わりに自動的に破棄されますが、mxFreeを使用して解放することができます。 mxMalloc上

情報はこれまで、「動作しない」または「機能しません」絶対に使用しないでくださいthe Matlab help files

+0

シンプルな3x3システムでも解決できないほどのメモリ割り当てが重要ですか? – Ali

+0

これは、メモリ割り当てが上書きする内容によって異なります。それは、動的メモリ割り当てに関するものです.1つはスリップし、時折しか表示されないエラーや実行時に矛盾する動作が発生する可能性があります。先日、私はいくつかのMEXコードから奇妙な振る舞いをしていましたが、それを使用する前に手動で動的に割り当てられたメモリを初期化していないということになりました。 (私はそれがゼロではないと仮定していた)。 MatlabはmxMallocを提供して、割り当てをよりうまく処理できるようにします。これは割り当てと同様に機能するので、一発の価値があります! – Dave

+0

私はそれをテストしたいと思いますが、私は専門家ではありませんし、それを行う方法を知っていません、私はmatlabのヘルプを読んだ後でも、私はヒントやそれを行う方法を理解するための小さなコードがありますか? – Ali

関連する問題