用c编写mex程序[二]
输入数据是在函数调用之前已经在Matlab里申请了内存的,由于mex函数与Matlab共用同 一个地址空间,因而在prhs[]里传递指针就可以达到参数传递的目的。但是,输出参数 却需 要在mex函数内申请到内存空间,才能将指针放在plhs[]中传递出去。由于返回指针 类型必须 是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内 存的申请,函 数原型如下: mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag ) m:待申请矩阵的行数 n:待申请矩阵的列数 为矩阵申请内存后,得到的是mxArray类型的 指针,就可以放在plhs[]里传递回去了。但 是对这个新矩阵的处理,却要在函数内完成,这 时就需要用到前面介绍的mxGetPr。使用 mxGetPr获得指向这个矩阵中数据区的指针(double 类型)后,就可以对这个矩阵进行各 种操作和运算了。下面的程序是在上面的show.c的基础 上稍作改变得到的,功能是将输 //reverse.c 1.0 #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { double *inData; double *outData; int M,N; int i,j; inData=mxGetPr(prhs[0]); M=mxGetM(prhs[0]); N=mxGetN(prhs[0]); m:待申请矩阵 的行数 plhs[0]=mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr(plhs[0]); for(i=0 ;iN;j++) xREAL); outData=mxGetPr(plhs[0]); for(i=0;iN;j++) outData[j*M+i =inData[ (N-1-j)*M+i]; } 当然,Matlab里使用到的并不是只有double类型这一种矩阵,还有字符串类型、稀疏矩 阵、结构类型矩阵等等,并提供了相应的处理函数。本文用到编制mex程序中最经常遇到 的 一些函数,其余的详细情况清参考Apiref.pdf。 Matlab与C++接口与混合编程讨论小结(六) |
GMT+8, 2025-4-11 21:45 , Processed in 0.042558 second(s), 23 queries , Gzip On.
Powered by Discuz! X3.4
Copyright © 2001-2021, Tencent Cloud.