2016-09-15 106 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