在Matlab mex中使用DGESV时出错

时间:2016-09-15 11:08:08

标签: matlab fortran mex lapack

我正在尝试用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

1 个答案:

答案 0 :(得分:1)

这样的系统错误通常表示您使用错误的内存分配损坏了内存。我注意到你使用标准的Fortran分配函数而不是mxMalloc,它允许MATLAB处理内存分配和释放。请注意,在MEX函数调用结束时,mxMalloc的内存会自动销毁,但您可以使用mxFree将其释放。

有关mxMalloc的信息,请参阅the Matlab help files