Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 用于调用dgesv LAPACK例程的mex文件_Matlab - Fatal编程技术网

Matlab 用于调用dgesv LAPACK例程的mex文件

Matlab 用于调用dgesv LAPACK例程的mex文件,matlab,Matlab,虽然我已经阅读了Mathworks文档,但我发现构建一个调用dgesv LAPACK例程的mex文件非常困难。谁能帮我一下吗?我在matlab方面还不错,在C方面还是个初学者,所以我无法解决这个问题 我有一个可以使用的代码,但我不知道如何继续 #include "mex.h" // Include headers for your library void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])

虽然我已经阅读了Mathworks文档,但我发现构建一个调用dgesv LAPACK例程的mex文件非常困难。谁能帮我一下吗?我在matlab方面还不错,在C方面还是个初学者,所以我无法解决这个问题

我有一个可以使用的代码,但我不知道如何继续

#include "mex.h"
// Include headers for your library

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
{
   void* x = mxGetData(prhs[0]); // Assume one input. Check nrhs
   plhs[0] = mxCreateDoubleMatrix(10,10,mxREAL); // Create 10x10 double matrix for output
   void* y = mxGetData(plhs[0]);
   yourLibraryFunction(x, y); // Read from x and write to y. Pass sizes in if needed
}

我不是专家,但我会尽力向你解释。请参见mathworks中的示例

参数prhs有输入参数(其中有NRH),plhs有输出参数(其中有NLH)

首先,您必须将参数“转换”为可以从C使用的类型。C中的参数是指向矩阵的指针,因此我们使用mxGetPr指向数据。在文档中,表示返回指向实际数据的第一个元素的指针,在C中,数组的名称是指向第一个元素的指针

然后使用mxGetM和mxGetN获得矩阵A和向量b的维数,在bnrhs保存矩阵b的列数,因为需要将其作为第二个参数传递给dgesv。但是,因为你在C语言中工作,并且你有指向真实数据的指针(通常在函数中,我们不想使用指向真实数据的指针),你必须复制矩阵,在C语言中,如果你想复制一个数组,你必须一个元素一个元素地复制,因为如果你在=A时,它们指向相同的位置。在mex文件中,我们使用mxCalloc而不是malloc

然后必须调用dgesv函数,最后必须通过使指针plhs[0]指向dgesv作为解返回给您的向量来返回结果

/*=========================================================
* dgesv.c
* example for illustrating how to use LAPACK within a C
* MEX-file on HP700, IBM_RS and PC.  
*
*  Solves the symmetric indefinite system of linear 
* equations A*X=B for X.
* X = dgesv(A,B) computes LU decomposition of A and returns 
* the result X such that A*X is B. 
* B must have as many rows as A. A is n-by-n matrix and b is n-by-bnrsh matrix
* http://www.netlib.org/lapack/double/dgesv.f
* This is a MEX-file for MATLAB.
*
* Compiling command in Matlab
* mex -v -g dgesv.c <matlab>\extern\examples\refbook\fort.c -I<matlab>\extern\examples\refbook <matlab>\extern\lib\win32\microsoft\msvc60\libmwlapack.lib
*=======================================================*/
#include "mex.h"
#include "c:\\matlab6p5\\extern\\examples\\refbook\\fort.h"

void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
{

   /* mex interface to LAPACK functions dsysvx and zhesvx */

   int m, n, bnrhs, lda, *ipiv, ldb, info;
   double *A,*b, *AT, *bT, *ret;
   int i;

   if (nrhs != 2) {
     mexErrMsgTxt("Expect 2 input arguments and return 1 output argument");
   }

   A = mxGetPr(prhs[0]);
   b = mxGetPr(prhs[1]);
   m = mxGetM(prhs[0]);
   n = mxGetN(prhs[0]); 
   bnrhs = mxGetN(prhs[1]);

   AT = (double *)mxCalloc(m*n,sizeof(double));
   bT = (double *)mxCalloc(m*bnrhs,sizeof(double));
   ipiv = (int *)mxCalloc(m,sizeof(int));

   for(i=0;i<m*bnrhs;i++) {
       bT[i] = b[i];
   }
   mexPrintf("\n");
   for(i=0;i<m*n;i++) AT[i] = A[i];
   lda = m;
   ldb = m;
   dgesv(&m, &bnrhs, AT, &lda, ipiv, bT, &ldb, &info);      

   for(i=0;i<m;i++) {
       mexPrintf("%f\t",bT[i]);
   }

   plhs[0] = mxCreateDoubleMatrix(m,bnrhs,mxREAL);
   ret = mxGetPr(plhs[0]);
   for(i=0;i<m*bnrhs;i++) ret[i] = bT[i];

   mxFree(AT);
   mxFree(bT);
   mxFree(ipiv);
}
/*=========================================================
*dgesv.c
*演示如何在C语言中使用LAPACK的示例
*HP700、IBM和PC上的MEX文件。
*
*求解对称不定线性方程组
*方程A*X=B表示X。
*X=dgesv(A,B)计算A的LU分解并返回
*结果X使得A*X是B。
*B的行数必须与A的行数相同。A是n×n矩阵,B是n×bnrsh矩阵
* http://www.netlib.org/lapack/double/dgesv.f
*这是一个用于MATLAB的MEX文件。
*
*Matlab中的编译命令
*mex-v-g dgesv.c\extern\examples\refbook\fort.c-I\extern\examples\refbook\extern\lib\win32\microsoft\msvc60\libmwlapack.lib
*=======================================================*/
#包括“mex.h”
#包括“c:\\matlab6p5\\extern\\examples\\refbook\\fort.h”
void MEX函数(int nlhs、mxArray*plhs[]、int nrhs、const mxArray*prhs[])
{
/*LAPACK函数dsysvx和zhesvx的mex接口*/
int m、n、bnrhs、lda、*ipiv、ldb、info;
双倍*A、*b、*AT、*bT、*ret;
int i;
如果(nrhs!=2){
mexErrMsgTxt(“预期2个输入参数,返回1个输出参数”);
}
A=mxGetPr(prhs[0]);
b=mxGetPr(prhs[1]);
m=mxGetM(prhs[0]);
n=mxGetN(prhs[0]);
bnrhs=mxGetN(prhs[1]);
AT=(双*)mxCalloc(m*n,sizeof(双));
bT=(双*)mxCalloc(m*bnrhs,sizeof(双));
ipiv=(int*)mxCalloc(m,sizeof(int));
对于(i=0;i