我正在尝试用mex文件中的DGESV解决线性系统。 当我有一个2x2系统时,mex文件工作正常并且没有发生错误,但是当系统大于2时,MATLAB系统错误对话框出现并说matlab遇到了内部问题并需要关闭。 我在64位Windows 10和英特尔作曲家XE 2013上使用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
答案 0 :(得分:1)
这样的系统错误通常表示您使用错误的内存分配损坏了内存。我注意到你使用标准的Fortran分配函数而不是mxMalloc,它允许MATLAB处理内存分配和释放。请注意,在MEX函数调用结束时,mxMalloc的内存会自动销毁,但您可以使用mxFree将其释放。
有关mxMalloc的信息,请参阅the Matlab help files