2016-09-15 103 views
0

我正試圖解決一個mex文件中DGESV的線性系統。 當我有一個2x2系統,mex文件工作正常,沒有發生錯誤,但是當系統大於2時,MATLAB系統錯誤對話框出現,並說matlab遇到了內部問題,需要關閉。 im使用MATLAB r2016a上64位的Windows 10和intel作曲家XE 2013錯誤在Matlab中使用DGESV mex

編譯行是:

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

系統錯誤這樣通常表明您損壞了內存分配不當的內存。我注意到你正在使用標準的Fortran分配函數而不是mxMalloc,它允許MATLAB處理內存分配和釋放。請注意,mxMalloc的內存在MEX函數調用結束時會自動銷燬,但您可以使用mxFree將其釋放。

上mxMalloc的信息可以在the Matlab help files

+0

即使簡單的3x3系統無法解決,內存分配是至關重要的嗎? – Ali

+0

這取決於內存分配覆蓋什麼!這就是關於動態內存分配的問題 - 一個漏洞,它可能會產生偶爾會出現的錯誤,或者從運行到運行的行爲不一致。就在前幾天,我從一些MEX代碼中發現了一些奇怪的行爲,這些行爲我沒有在使用它之前手動初始化動態分配的內存。 (我曾以爲它被分配爲零,但它不是)。 Matlab提供了mxMalloc,以便它能更好地處理分配 - 它的工作方式與分配相似,所以值得一試! – Dave

+0

我想測試一下,但即使不是專家,也不知道如何做到這一點,即使我閱讀了matlab幫助後,也可以通過提示或小代碼瞭解如何做到這一點? – Ali