在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
如下为本人亲证代码: 一: 编译器的安装与配置(环境不同,显示结果不同) 要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器: 5.0、6.0版的MicroSoft Visual C++(MSVC) 5.0、5.2、5.3、5.4、5.5版的Borland C++ LCC(由MATLAB自带,只能用来产生MEX文件) 下面是安装与配置MATLAB编译器应用程序MEX的设置的步骤: (1)在MATLAB命令窗口中运行mex –setup,出现下列提示: Please choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers [y]/n? Select a compiler: [1] Borland C++Builder version 6.0 in C:\Program Files\Borland [2] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio [3] Lcc C version 2.4 in D:\MATLAB6P5P1\sys\lcc [4] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio [0] None Compiler: (3)选择其中一种(在这里选择了3),MATLAB让用户进行确认: Please verify your choices: Compiler: Lcc C 2.4 Location: D:\MATLAB6P5P1\sys\lcc Are these correct?([y]/n): 二在matlab当前目录下新建 add.c文件。输入 #include "mex.h" //使用MEX文件必须包含的头文件 //mex 通过 //a=add(b,c) double add(double x,double y) { return x+y; } //MEX文件接口函数 void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { //步骤一:声明 // 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误 // 源文件名后缀为.cpp时,没有上面的问题,...- -|| double b,c; double *a; //步骤二:操作输入数据 //对输入数据进行操作,根据需要选择这几个函数mxGetPr指针指向参数的数据地址、 mxGetM 、 mxGetN 得到矩阵数据的行和列 (返回整数)。 b=*(mxGetPr(prhs[0]));//*代表取地址的内容 c=*(mxGetPr(prhs[1])); //步骤三:操作输出数据, //对于输出数据,需要首先用专门的mex函数分配内存空间 plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //同输入数据一样,要对输出数据操作,我们也需要一个指向数据的指针变量 a=mxGetPr(plhs[0]); //步骤四:调用add *a=add(b,c); } 三、C文件已写好,名为add.c。那么在Matlab中,输入: >> mex add.c 就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows多出MEX文件
>> output = add(1.1,5) 五、得到输出结果
output = 6.1000 案例二: 在matlab中建立EstabHibert.cpp的文件,并插入如下代码
//Matlab以MEX方式调用C代码示例二 //功能:建立一个n*n的Hibert 矩阵 ,n存放输入值,y存放输出的矩阵 // 【例1】用m文件建立一个1000×1000的Hilbert矩阵代码如下。 // // tic // // m=1000; // // n=1000; // // a=zeros(m,n); // // for i=1:1000 // // for j=1:1000 // // a(i,j)=1/(i+j); // // end // // end // // toc #include "mex.h" //计算过程,该过程包含了MEX文件实现计算功能的代码,是标准的C语言子程序。 void hilb(double *y,int n) { int i,j; for(i=0;i<n;i++){ for(j=0;j<n;j++){ *(y+j+i*n)=1/((double)i+(double)j+2); } } } //接口过程 void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { //步骤一:声明 // 源文件名后缀为.c时,所有变量声明必须一次性完成,且放在最前面, 否则mex编译错误 // 源文件名后缀为.cpp时,没有上面的问题,...- -|| //double x,*y; // int n; double* y; int n; //检测输入、输出参数个数和类型的正确性 if(nrhs!=1) mexErrMsgTxt("One inputs required."); if(nlhs!=1) mexErrMsgTxt("One output required."); if(!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1) mexErrMsgTxt("input must be scalars"); //scalars 代表标量,double型是标量的一种哦 n=mxGetScalar(prhs[0]); plhs[0]=mxCreateDoubleMatrix(n,n,mxREAL); // n=mxGetM(plhs[0]); //get rows y=mxGetPr(plhs[0]); hilb(y,n); }
mex EstabHibert.cpp a= EstabHibert(1000);
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论