南京网站建设王道下拉??/外贸网站推广怎么做
Matlab:编译性语言
- 优点:方便的实现编程过程中的交互,免去了编译过程
- 缺点:执行速度慢!!
- 解决方法:
①尽量使用矩阵运算代替循环语句,但实际情况中难以找到等效的矩阵运算;
②C/C++和Matlab混合编程—mex接口函数
mex概述
- mex是Matlab提供的一种混合编程方式。
- 通过mex,用户可以在Matlab中调用C/C++或者Fortran编写的计算程序,加速Matlab内部的矩阵运算(尤其是加速Matlab代码中的for循环)。
- mex本质上是一个动态链接库文件,可以被Matlab动态加载并执行。
mex文件的结构及讲解
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[]){ // chunk
}
- mex.h"引入mex编程相关的函数即类型定义。
- mex文件在不同平台下有不同的扩展名,例如win32平台下的扩展名为.mexw32,可以通过mexext命令查看mex文件的扩展名。
- mex文件本质上是一个动态链接库文件,其只有一个导出函数,就是mexFunction。mexFunction类似于Windows DLL文件中的DLLMain函数或者普通可执行程序中的main函数。
- 注意:每个mex文件中都应该存在这四个参数,根据你要用的C函数进行设置。重点是搞清楚想要转化的函数输入和输出参数,包括个数以及类型。
int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[]- nlhs代表的是输出参数的个数。
- plhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输出。
- nrhs代表的是输入参数的个数。
- prhs是一个指针数组,里面的指针指向mxArray类型,每一个指针指向一个输入。
由于mex中经常需要操作Matlab数组或者矩阵,所以经常会用到matrix.h中定义的一些mx_前缀的函数,最常用的为以下几个:
- mxGetScalar(prhs[0]) :把通过prhs[0]传递进来的mxArray类型的指针指向的数据赋给C程序里的变量**(针对标量)** ;
- mxGetPr(prhs[0]) :从指向mxArray类型数据的prhs[0]获得了指向double类型的指针 (针对矢量矩阵);
- mxGetM(prhs[0]): 获得矩阵的行数
- mxGetN(prhs[0]): 获得矩阵的列数
- mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag)
:实现内存的申请,其中,m:待申请矩阵的行数 ; n:列数
(要输出参数,必须先申请相应大小的内存)
实例
① 明确想要在matlab里调用的原始C语言函数
double mexSimpleDemo(double *y,double a,double b){ return *y=(a>b)?a:b;}
分析:输入参数为a和b,个数为2,类型为标量。
输出参数为y,个数为1,类型为矢量。
②编写mex接口函数,存为.c文件。这个文件不一定要在vs中写,可以在matlab里创建一个.c后缀的文件,甚至可以在txt中写好,将后缀改为.c。写完该函数之后,将这个函数复制到matlab文件夹里即可。
double mexSimpleDemo(double *y,double a,double b){return *y=(a>b)?a:b;}void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){double *y; //输出参数1个double m,n;//输入参数2个m=mxGetScalar(prhs[0]);//获取第一个输入参数a n=mxGetScalar(prhs[1]); //获取第二个输入参数bplhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);//为输出参数y申请1*1的内存块y=mxGetPr(plhs[0]);//将输出y加到申请的内存块上mexSimpleDemo(y,m,n);//调用上面的C语言函数}
③在Matlab函数中创建一个.m文件进行测试:
mex mexSimpleDemo.c
a=mexSimpleDemo(5,3)
结果如下:a=5