Matlab中Mex文件的创建和使用方法汇总
mcc、mbuild和mex的区别
好多学习Matlab扩展编程的人经常把这几个命令给搞混淆的,下面我就给大家仔细讲讲,希望呢给大家讲明白!先简单的说说mcc、mbuild和mex到底怎么回事:mcc将M文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mexmex将C/C++文件(入口函数为mexfunction())编译成MEX(DLL)文件(需要C/C++编辑器) mbuild将C/C++文件(入口函数为main())生成可独立运行的C应用程序(需要C/C++编辑器) 复制代码一mcc命令Matlab编译器使用mcc命令能将一个M文件翻译成C文件,同时生成一个相应的包裹文件,这个包裹文件包含了编译器产生的代码和它支持的可执行文件类型之间所需的接口。
利用改包裹文件提供的接口,生成的C文件能用在任何编译器所支持的可执行文件类型(如MEX文件、EXE文件、DLL文件)中,这些C文件与最终生成的可执行文件是相互独立的。
Matlab编译器(Lcc)在特定的条件下能自动调用mex和mbuild函数,尤其是mcc –x/-m/-p 时。
(1)创建MEX文件>>mcc –x filename (注意这个命令在2008a中已经去掉了)将M文件filename.m翻译成C 代码,并生成一个可被Matlab直接调用的C的MEX。
(2)创建simulink S函数>>mcc –s filename将M文件filename.m翻译成C代码,并生成一个相应的simulink S函数,该函数的输入输出变量的大小可动态改变。
(3)创建可独立执行的C程序>>mcc –m filename将M文件filename.m翻译成C代码,生成的可执行文件能独立于Matlab运行环境。
(4)创建可独立运行的C++程序>>mcc –p filename将M文件filename.m翻译成C++代码,生成的可执行文件能独立于Matlab运行环境。
MATLAB高级应用.ppt
size为需要读取的数据个数
2020/4/7
MATLAB_高级应用
12
写格式化文件
fprintf命令:写入格式化数据 count=fprintf(fid,format,a) count为成功写入数据的个数; fid为文件指针,所指为二进制文件; a为矩阵数据,将a写到fid指向的文件; format为写入的格式;
2020/4/7
MATLAB_高级应用
17
文件定位
2. ftell命令:用来获取文件位置指针的当前位 置。pos=ftell(fid)
说明:pos指字节数,当前位置指针指 在此字节数之后。
3. frewind命令:用来将文件位置指针移到文 件的开头。
frewind(fid)
4. feof命令:用来测试位置指针是否在文件结 束位置,如果是则返回1,否则返回0。
MATLAB_高级应用
11
读格式化文件数据
fscanf命令 :读格式化文件数据。
[a,count]=fscanf(fid,format,size) a返回读取的数据; count为成功读取的数据元素个数; fid为文件指针,所指为需要读取的格式
化文件;
format指定读取数据格式,以“%”开头 (与C语言类似);
MATLAB高级应用
MATLAB应用接口 文件的输入输出 Notebook
2020/4/7
MATLAB_高级应用
1
MEX 文件
MEX即MATLAB可执行程序。 MEX文件是 由C或FORTRAN程序编译生成的, 用mex命令。 也可以由M文件经由C源代码生成,用mcc-x命令。
MEX 文 件 在 Windows 系 统 是 扩 展 名 为 DLL 的动态链接库,类似于MATLAB的内部函数,在 M文件中可以直接调用。
第8章 MATLAB高级应用
%关闭文件指针所指的文件 %关闭所有打开的文件
【例8.3】 打开和关闭1个文本文件。 文本文件“Ex0805.txt”,在MATLAB环境中显示的文件内容如下。 >> type Ex0805.txt a123 b456 使用fopen和fclose命令打开和关闭文件。
>> [fid,message]=fopen('Ex0805.txt','w+') fid = 3 message = '' >> if fid==1 disp('无法打开该文件') else disp('成功打开该文件') end 成功打开该文件 >> status=fclose(fid) status = 0 %打开文件读/写
提供用户选择编译器作为默认的MEX文件编译器,通过键盘输入“1”后, 按回车键后出现如下提示。 Please verify your choices: Compiler: Lcc-win32 C 2.4.1 Location: C:\PROGRA~1\MATLAB\R2010a\sys\lcc Are these correct [y]/n? y Trying to update options file: C:\Users\CAOYI\AppData\Roaming\ MathWorks\MATLAB\ R2010a\ mexopts.bat From template: C:\PROGRA~1\MATLAB\R2010a\bin\win32\mexopts\lccopts.bat Done . . .
【例8.1】 在Microsoft Visual C++6.0环境下创建1个MEX文件,实现计算1 个数的平方的倒数。 ① 在Microsoft Visual C++6.0环境下创建1个“C++ Source File”文件,文 件名为“Ex0801.cpp”。 ② 编写该文件的程序代码。 ③ 在MATLAB命令窗口的当前目录浏览器中将当前目录设置为用户的目录,
MATLAB 以 MEX 方式调用 C 源代码
end end
基于 C 的 Hilbert 生成函数:
#include "mex.h" //计算过程 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+1);
Example 3:矩阵乘法
#include "mex.h" //计算过程 void multi(double *y,double *A,double *B,int N) {
for(int i=0;i<N;i++) {
for(int j=0;j<N;j++) {
(*(y+j+i*N))=0; for(int k=0;k<N;k++) {
mxCreateCellArray
创建 n 维元胞 mxArray
mxCreateCellMatrix
创建二维元胞 mxArray
mxCreateCharArray
创建 n 维字符串 mxArray
mxCreateCharMatrixFromStrings 创建二维字符串 mxArray
mxCreateDoubleMatrix
(5) 获取行维和列维函数 mxGetM、mxGetN 其格式如下: #include "matrix.h" int mxGetM(const mxArray *array_ptr); int mxGetN(const mxArray *array_ptr); 与之相关的还有: mxSetM:设置矩阵的行维 mxSetN:设置矩阵的列维
matlab外部接口编程创建c语言mex文件
第3章 创建C语言MEX文件
在执行simple.c程序时,命令行中必须给定合适的输出 参数,否则根据程序中的判断将给出错误的信息,该信息是 通过mexErrMsgTxt函数给出的,该函数的详细解释可以参阅 MATLAB的帮助文档,在3.5小节中,还会再次使用该函数来 控制程序的错误。
第3章 创建C语言MEX文件
3.2 MEX源文件的结构
3.2.1 源文件的基本结构
C语言MEX源文件是标准的C语言源文件,其程序的基本 语法完完全全是ANSI C的语法结构。所以,请读者注意,某 些C/C++编译器不仅仅支持标准C语言的语法,可能还支持一 些特殊的C语法结构,例如Microsoft Visual C/C++ 6.0的编译器 支持以“//”的形式添加程序注释,这些特殊的程序特性最好不 要出现在C语言MEX源文件中,以免影响了程序的可移植特性。
nlhs:表示输入参数的个数。
Plhs:mxArray类型的指针数组,表示MEX函数的输入参 数。
Nrhs:表示输出参数的个数。
Prhs:mxArray类型的指针数组,表示MEX函数的输出参 数。
第3章 创建C语言MEX文件
其实上述输入、输出参数的名称非常容易记忆,lhs代表 Left hand parameters,rhs代表right hand parameters,n 代表number,p代表pointer。这里的左手和右手如何划分呢? 例如在MATLAB中调用求伯特图的函数时,可以这样表示:
第3章 创建C语言MEX文件
例3-1的源文件第004行和005行为C语言MEX源文件的入口 函数部分。这两行代码是所有C语言MEX源文件必须包含的内容, 而且书写的内容也必须按照固定的格式,也就是说必须按照例 子中的书写方法来表示这两行代码: void mexFunction(int nlhs, mxArray *plhs[],
MATLAB 编译MEX文件的方法
MATLAB 编译MEX文件的方法2010-10-07 11:22:23| 分类:默认分类| 标签:|字号大中小订阅通过MEX文件可以在MATLAB中像调用内嵌函数一样调用现有的使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能解决MATLAB循环效率低的缺点,提高MATLAB环境中数据处理的效率。
MEX文件的后缀名为.mexw32MEX文件的编写和编译需要两个基本条件:一是必须按照MATLAB应用程序接口组件和相关工具,二是要有C语言或Fortran语言的编译器。
需要对MATLAB系统进行设置,使MATLAB系统知道使用系统的哪一个C语言编译器,以及其参数和路径。
MEX文件系统设置:>> mex –setup 按照提示进行,最后出现Done…系统配置完毕。
C语言MEX文件的建立C语言MEX文件的建立1.MEX文件的结构a)计算子程序b)入口子程序,void mexFunction(int nlhs, mxArray *plhs[],int nrhs,constmxArray *prhs[]) { /*用户特定的代码….*/ }2.创建timestwoalt.c#include "mex.h"void timestwo_alt(double *y, double x){*y = 2.0*x;}void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ){double *y;double x;/* 检查参数*/if (nrhs != 1) {mexErrMsgTxt("One input argument required.");} else if (nlhs > 1) {mexErrMsgTxt("Too many output arguments.");} else if (!mxIsNumeric(prhs[0])) {mexErrMsgTxt("Argument must be numeric.");} else if (mxGetNumberOfElements(prhs[0]) != 1 || mxIsComplex(prhs[0])) { mexErrMsgTxt("Argument must be non-complex scalar.");}/* 为输出参数创建变量*/plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL);/*为参数x、y赋值,x为值,而y为指针(由于MATLAB没有值传递,所以用指针才能得到修改后的y值,不然修改的是y的一个副本,为临时变量,在函数返回时,y值没有变化,不能得到希望的结果)*/x = mxGetScalar(prhs[0]);y = mxGetPr(plhs[0]);/* 调用timestwo_alt 子函数*/timestwo_alt(y,x);}3.编译链接C语言的MEX文件源程序,在MATLAB的控制窗口中输入:mextimestwoalt.c生成一个名为timestwoalt.mexw32的MEX文件4.运行:在MATLAB的控制窗口中输入x=2;y=timestwoalt(x)输出:y=4MEX文件实现了一种C语言与MATLAB的接口,其实际的计算功能仍在C语言形式的计算子程序中完成,而入口子程序的功能是检查参数以匹配C语言的参数规范(how to?)。
实用MATLAB教程第八章
第8章MATLAB高级应用8.1 MATLAB应用接口MATLAB是一个看似封闭的系统,但具有多种接口功能,有外部数据接口和应用程序接口,用户可以十分方便地与其它应用程序交换数据和信息。
比如,MATLAB可以与C和FORTRAN程序相互调用,从而充分发挥MATLAB数值计算的长处,而避开其运行速度慢的短处。
8.1.1 MEX文件MEX就是MATLAB Executable的缩写,即MATLAB可执行程序。
MEX文件是由C 或FORTRAN程序编译生成的,也可以由M文件经由C源代码生成。
MEX文件在Windows 系统是扩展名为DLL的动态链接库,类似于MATLAB的内部函数,在M文件中可以直接调用。
MEX文件具有以下几个方面的应用:(1) 对于已存在的C或FORTRAN子程序,可以通过MEX文件在MATLAB环境中直接调用,而不必重新编写M文件。
(2) 由于MATLAB是解释性语言,运行如for等循环体时,会出现速度十分缓慢的现象,为了能提高速度,往往要使用MEX程序。
(3) 对于A/D、D/A卡,或其它PC硬件,可以直接用MEX文件进行访问。
(4) 利用MEX文件,可以使用如Windows用户图形界面等资源。
由于MATLAB是用C语言编写的,有很多科学计算子程序又来自FORTRAN程序库,因此在MATLAB中,通过调用用户自己开发的C或FORTRAN程序,由编译器编译成动态链接函数,执行速度和C或FORTRAN程序相同,就可以达到提高计算效率的目的。
在MATLAB中,如果有同名的文件则调用的顺序是先执行MEX文件,其次是DLL文件,最后才是M文件,而help命令则会只处理.m文件。
1. MEX文件系统设置MEX文件的编写与编译需要两个条件:已经安装的MATLAB应用程序组件及相应的工具和合适的C或Fortran语言编译器。
MATLAB本身包含了C语言编译器Lcc,但不包含Fortran编译器。
matlab mex并行
利用MEX文件在Matlab中创建并行应用# include "mex.h"# include "math.h"# include <windows.h># define _MAX_THREAD 100/*判断线程是否执行完毕*/static volatile intWaitForThread[_MAX_THREAD]; /*判断各线程执行情况*/static volatile double percentage[_MAX_THREAD];/*保存程序执行信息*/static intnThreadNum=0;static intisOpen=0;HANDLE * ThreadLIST=NULL;double * pOut=NULL;static int MM=0;static int NN=0;/*线程参数结构体*/typedefstruct _ThreadArg{int N;//输入阵列元素个数double * pr1;//输入阵列1double * pr2;//输入阵列2double * pOut;//计算结果intthreadld;//线程编号}threadArg;unsigned __stdcallthreadFunc(threadArg * pArg) {int id;int kk-0;int N=0;double * pr1;double * pr2;double * pOut;//分配数据N=(int)(pArg->N/nThreadNum)+;nb=id*N;ne=(id+1)*N-;if(ne>=pArg->N){ne=pArg->N-;}for(kk=nb;kk<=ne;kk+ + ){pOut[kk]=pr1[kk]+pr2[kk];//完成计算percentage[id]=(kk-nb)*/(ne-nb);}WaitForThread[id]=0;return 0}void mexFunction(intnlhs,mxArray * plhs[]) {if(nrhs= =1)//关闭线程、查询状态和返回结果 {int flag;flag=mxGetScalar(prhs[0]);if(flag==1)//关闭{intkk;intisOK;for(kk=0;kk<nThreadNum;kk+ +){isOK=TerminateThread(ThreadList[kk],0); CloseHandle(Thread[kk]);if(isOK){mexPrintf("线程 %d 成功结束\n',kk);}else{mexPrint("线程 %d 成功失败\n",kk);}}}if(pOut) free(pOut);pOut=NULL;isOpen=0;}else if(flag= =2)//查询状态{intkk=0;for(kk=0;kk<nThreadNum;kk+ +){mexPrintf("线程 %d,是否等候:%s,状态%d%%\n", WaitForThread[kk]?("是"):("否"),(int)(precentage[kk]*100));}}else//获取结果{int flag=1;intkk;for(kk=0;kk<nThreadNum;kk+ +){flag=flag&WaitForThread[kk];}if(!flag){plhs[0]=mxCreateDoubleMatrix(MM,NN,mxREAL);memcpy(mxGetPr(plhs[0]),pOut,MM*NN*sizeof(double));}else{plhs[0]=mxCreateDoubleMatrix(0,0,mxREAL);}}}else//启动{threadArg * pArg;intkk;if(nrhs= =2){nThreadNum=4}nThreadNum=mxGetScalar(prhs[nrhs-1]);if(nThreadNum<=0){return;}ThreadList=(HANDLE* )malloc(nThreadNum* sizeof(HANDLE));pARG=(ThreadArg*)malloc(nTreadNum*sizeof(threadArg));if(pOut! =NULL){Free(pOut);pOut=NULL;}/*初始化参数*/pOut=(double*)malloc(sizeof(double)*mxGetM(prh[0])*mxGetN(prhs[0]);for(kk=0;kk<nThreadNum;kk+ +){pArg[kk].N=mxGetM(prhs[0]*mxGetN(prhs[0]));pArg[kk].pr1=mxGetPr(prhs[0]);pArg[kk].pr2=mxGetPr(prhs[1]);pArg[kk].pOut=pOut;pArg[kk].threadld=kk;WaitForThread[kk]=1;percentage[kk]=0;}/*保存输入数值列阵大小。
MATLAB外部接口编程(张威)第4章69页PPT文档
第4章 创建Fortran语言MEX文件
从程序的第001行开始到006行,都是Fortran语言MEX源文 件入口函数的声明部分:
C 入口函数 subroutine mexFunction(nlhs, plhs, nrhs, prhs)
C------------------------------------------------C 参数声明
038 C Call the Assignment Subroutine
039
call AssignNumericData(pr)
040 C Finished!
041
return
042
end
第4章 创建Fortran语言MEX文件 例4-2的代码是更完整的Fortran语言的MEX函数文件应用,
此程序可以分为如下部分:首先从程序的007~015行是赋值运 算的子函数,该函数在入口函数中调用,调用的代码在038行。 与 一 般 的 C 语 言 MEX 文 件 不 同 , C 语 言 的 MEX 文 件 直 接 利 用 memcpy函数完成数据的拷贝(复制),而Fortran语言本身没有 提 供 这 样 的 函 数 , 于 是 在 simple.f 的 源 代 码 中 , 使 用 了 mxCopy函数完成mxArray数据和Fortran语言数据的交互。这 个函数就是在012行调用的mxCopyReal8ToPtr,该函数的定义 如下:
integer plhs(*), prhs(*) integer nlhs, nrhs mexFunction函数类似C语言源文件的main函数,它是 MEX文件的入口函数。当在MATLAB命令行中执行MEX函数 时,MATLAB解释器将从此函数处开始执行MEX代码。
Mex简易教程
昨天用Matlabmex做了个函数,觉得很方便,这里把方法简单说下,供大家参考下!说的不好请包涵为什么要用Mex,因为可能在matlab里面有些繁琐的循环,会耗尽你的时间,要知道,matlab最不擅长的就是做for循环了,最擅长的是矩阵运算,因此我们可以调用C语言的动态链接库来帮我们计算一些matlab中比较费时的循环。
实验证明,C算的真快。
//ComputKernel函数代码#include "mex.h";#include <math.h>void ComputKernel(double gamma,intnRow,intnCol,const double *Src,double *Dst){double sum,temp;int i,j,s,index1,index2;for (i=0;i<nRow;i++)for (j=i;j<nRow;j++){if (i!=j){sum = 0.0;for (s=1;s<nCol;s++){index1 = i+s*nRow;index2 = index1 -i +j;temp = Src[index1] - Src[index2];sum += temp*temp;}temp = Src[i]*Src[j]*exp(-gamma*sum);;Dst[i+j*nRow] = temp;Dst[j+i*nRow] = temp;}elseDst[i+j*nRow] = Src[i]*Src[j];}}void mexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]) {double *Src;double *Dst;double gamma;intstatus,nRow,nCol;if (nrhs!=2){mexErrMsgTxt("Two inputs required.");}if (!mxIsDouble(prhs[0]) || mxIsComplex(prhs[0])||mxGetN(prhs[1])*mxGetM(prhs[1])!=1){mexErrMsgTxt("格式为:KernelMatrix(Matrix,gamma)");}gamma = mxGetScalar(prhs[1]);Src = mxGetPr(prhs[0]);nRow = mxGetM(prhs[0]);nCol = mxGetN(prhs[0]);plhs[0] = mxCreateDoubleMatrix(nRow,nRow,mxREAL);Dst = mxGetPr(plhs[0]);ComputKernel(gamma,nRow,nCol,Src,Dst);}将上述代码保存在ComputKernel.c文件中!void mexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]) 是mex函数的接口,就好像编写控制台程序,要写一个main()函数一样的。
MEX文件简介
VS2015联合matlab2016b生成mexw64文件
Vs2015联合matlab2016b生成.mexw64文件2017.12最近要用C-mex文件,搜索了好几天在网上没有发现有用的资料,要么资料太旧,使用不了,最终在matlab帮助文档和国外的网站论坛上求助最终后成功。
在此要特别强调,遇到问题的第一件事是去查帮助文档,而不是search。
耐下心去看英文文档,真正高深的有用的基本上在帮助文档里面都有解释。
实在解决不了的去论坛上提问,高手还是很多的。
最后程序也可以在Codeblocks上运行生成,感谢外国友人的帮助,有时间的话会写一篇关于Codeblocks上运行生成mexw64文件的文章。
有想知道了解的可以私信我。
一、Matlab和IDE混合编程的方法有以下几种:1、matlab调用由IDE编译出来的mex文件(相当于动态链接文件,这一点相当重要,不要使用生成控制台程序,这一点一错,后面都不用看了),老版本的mex文件后缀是.dll,新版本的mex文件后缀是.mexw32/64(根据版本生成)。
2、IDE通过engine调用matlab文件。
以上两种方法matlab帮助文档写的都包括,这种只详细讲第一种方法。
二、使用的平台是matlab2016b 64位和VS2015社区版。
(把下面所述的项目,C文件名称全部改为arrayProduct)1、新建一个项目,选择win32/win32项目(可用于创建DLL和静态库项目),不是选择的win32控制台应用程度。
下面输入位置名称等,下一步选择程度类型为DLL,设置一个空项目2、然后生成解决方案如图所示在源文件里面添加一个C文件,或者已有的C文件。
因为matlab是64位,所以调试工具也要选择X643、在源文件里面新建一个模块定义文件.def,文件的名称与项目,C文件名称一致。
添加内容如下4、设置项目属性:1、平台是X64,在配置属性里面的目标扩展名更改为:.mexw642、在C/C++常规项里的附加包含目录是设定:C:\Program Files\MATLAB\R2016b\extern\include这个里面包含的应该是VS所需要调用的matlab的头文件。
编写MatlabmexFunction(Cmex)
编写MatlabmexFunction(Cmex)资料⼀ MATLAB的MEX⽂件编写和调试1. MEX的编写格式写MEX程序其实就是写⼀个DLL程序,所以你可以使⽤C,C++,Fortran等多种编程语⾔来写。
编写MEX程序的编辑器可以使⽤MATLAB的代码编辑器,也可使⽤⾃⼰的C++编辑器,如VS2008等。
⽤MATLAB的编辑器的好处是,MEX函数会加粗⾼亮显⽰,这给程序编写带来便利,可惜⽆法动态调试。
如⽤VC即可编译也可调试,⽐较⽅便。
mex的编译结果实际上就是⼀个带输出函数mexFunction 的dll⽂件,所以会⽤VC编写和调试dll,就会⽤VC编写和调试MEX程序。
a. MEX⽂件格式#include "mex.h"void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ){}四个参数分别⽤来输出和输⼊数据: nlhs 输出参数个数,plhs 输出参数指针 (nrhs和prhs是输⼊参数相关的)。
注意: 我们对输出和输⼊参数的操作都是通过指针的⽅式进⾏的。
(这点很容易理解,因为我们的计算结果是需要传递给MATLAB的,实际上我们传递的不是数据,⽽是指针。
MATLAB可以通过这些指针,访问内存中的数据。
)b. 操作输⼊数据对输⼊数据进⾏操作,需要通过MEX函数mxGetPr 得到数据的指针地址。
mxGetM 和 mxGetN 得到矩阵数据的⾏和列 (返回整数)。
对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作(不过似乎是,plhs, prhs都是指向double类型的指针,所以下⾯的这个M等,都要定义成double*类型的)。
如:double *M;int m, n;M = mxGetPr(prhs[0]); // 指针指向第⼀个参数的数据地址m = mxGetM(prhs[0]);n = mxGetN(prhs[0]);需要注意的是,MATLAB矩阵数据的存储顺序是"从上到下,从左到右"。
mcc mex mbuild
一mcc命令Matlab编译器使用mcc命令能将一个M文件翻译成C文件,同时生成一个相应的包裹文件,这个包裹文件包含了编译器产生的代码和它支持的可执行文件类型之间所需的接口。
利用改包裹文件提供的接口,生成的C文件能用在任何编译器所支持的可执行文件类型(如MEX 文件、EXE文件、DLL文件)中,这些C文件与最终生成的可执行文件是相互独立的。
Matlab 编译器(Lcc)在特定的条件下能自动调用mex和mbuild函数,尤其是mcc –x/-m/-p时。
(1) –x 创建MEX文件>>mcc –x filename(注意这个命令在2008a中已经去掉了)将M文件filename.m翻译成C代码,并生成一个可被Matlab直接调用的C的MEX。
(2) -s 创建simulink S函数>>mcc –s filename将M文件filename.m翻译成C代码,并生成一个相应的simulink S函数,该函数的输入输出变量的大小可动态改变。
(3) -m 创建可独立执行的C程序>>mcc –m filename将M文件filename.m翻译成C代码,生成的可执行文件能独立于Matlab运行环境。
(4) -p 创建可独立运行的C++程序>>mcc –p filename将M文件filename.m翻译成C++代码,生成的可执行文件能独立于Matlab运行环境。
(5) -B sgl 创建可独立运行的C图形库函数>>mcc –B sgl filename如果filename.m中包含了对Matlab图形处理函数的调用,上述命令,将filename转换成为C语言,并生成一个能独立于Matlab运行环境的可执行程序。
(6) -B sgl cpp创建可独立运行的C++图形库函数>>mcc –B sgl cpp filename如果filename.m中包含了对Matlab图形处理函数的调用,上述命令,将filename转换成为C++语言,并生成一个能独立于Matlab运行环境的可执行程序。
matalb中mex文件调试
matalb中mex文件调试Matlab 中MEX 文件调试方法总结首先解释下mex文件的由来,mex是matlab提供的与外部语言如C、C++、Fortran提供的接口函数,称之为mex function。
所以我们用上诉语言编写的源文件叫mex function,把这些文件经过build 就可以生成mex 文件,mex 文件在matlab中执行。
有关matlab中mex的用法,可以见help,搜索mex即可。
MEX function有一套自己的编写规则,主要是和matlab的接口问题,本质上是参数传递问题,学习这个,最好找个别人做好的工程例子,参考模仿。
另外mex function经过build 生成mex file,以及mex file的属性帮助里面也有详细解释。
此篇重点讲解debug问题,m文件可以在matlab环境下调试,由于mex文件是经过build 生成的,无法直接调试,所以要借助相应语言的开发环境进行调试,这很简单,只需要把mex function文件在matlab环境下编译的时候加上debug选项即可,例如我们编译一个名字为example.c 的mex function文件,可以在matlab的command窗口输入命令“mex –g example.c”即可。
本篇暂只讲解windows环境的调试方法,另外以C语言mex function作为例子,并假设开发环境已经配置好,编译器为VC(各种可行版本)。
下面我们介绍根据mex 文件的类型来决定我们的调试方法,如果照上述编译方法生成的是example.dll,假设其绝对路径为E盘下的project文件夹,我们只要在windows的命令窗口输入msdev E:\project example.dll系统会自动启动VC,选择project菜单下的Setting子菜单打开对话框如下图所示:选择上图界面,在Executable for debug session编辑框内,点击选择matlab可执行文件(自己根据matlab安装路径查找),然后点击OK即可。
mcode 方法
mcode 方法MATLAB是一种非常流行的计算机编程语言,它主要用于数据分析、数值计算和可视化。
MATLAB的核心部分是其集成开发环境 (IDE),该IDE允许用户编写、测试和运行MATLAB代码,并提供有用的工具和功能来简化这个过程。
在MATLAB中,函数是指一组按照一定的规则组织在一起的可重复使用的代码块。
而mex文件是一种可以被MATLAB调用的动态链接库文件,允许用户使用其他语言(如C、C++等)编写的代码。
本文将介绍MATLAB中的mcode 方法。
在MATLAB中使用mex文件有多种方法,其中mcode方法是最常用的方法之一。
mcode方法需要用户在MATLAB中编写一个m文件,该m文件定义了一个或多个函数,这些函数调用mex文件中的函数来完成一些计算任务。
下面是一个简单的示例,其中演示了如何使用mex文件来计算两个向量的点积。
1. 创建mex文件首先,需要创建一个C文件,该文件包含了计算两个向量点积的函数。
下面是一个简单的示例:#include "mex.h"#include "matrix.h"void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[]){double *x,*y;double res=0;mwSize m,n;if(nrhs!=2)mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","Two inputs required.");if(nlhs!=1)mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One output required.");if( !mxIsDouble(prhs[0]) ||!mxIsDouble(prhs[1]) )mexErrMsgIdAndTxt("MyToolbox:arrayProduct:notDouble","Input must be double.");m = mxGetM(prhs[0]);n = mxGetN(prhs[0]);x = mxGetPr(prhs[0]);y = mxGetPr(prhs[1]);for(int i=0;i<m*n;i++)res += x[i]*y[i];plhs[0] = mxCreateDoubleScalar(res);}在该文件中,我们定义了一个名为mexFunction的函数,该函数接受两个输入参数和一个输出参数。
Visual Studio创建Matlab mex
Visual Studio创建Matlab mex(dll)函数本文主要介绍在Windows XP 32bit操作系统下,利用Visual Studio 2005,如何生成Matlab 可执行的mex(dll)文件。
(1). 首先,使用Visual Studio 2005编译生成动态链接库dll文件。
(2). 然后,在Matlab 2009b中调用生成的mex(dll)文件。
1). 打开Visual Studio 2005,建立一个Win32 Project,项目名为test_matlab_32). 项目类型设定时选择DLL,并选定Export symbol和Empty project,注意要先选Export symbol再选Empty project。
3). 然后打开project -> add new item,添加C++ file 文件名为mexFunction.cpp。
文件代码后附。
4). 然后打开tool -> option -> Projects and Solutions -> VC++ Directories -> Include files 增加matlab头文件目录地址。
"C:\Program Files\MATLAB\R2009b\extern\include"。
由于最近经常使用matlab,就把头文件目录添加到VC设置中。
如果只是偶尔使用matlab,可以把头文件目录加到project -> test_matlab_3 properties -> C++ -> General -> Additional Include Directories 中。
5). 然后打开tool -> option -> Projects and Solutions -> VC++ Directories -> Library files 增加matlab库文件目录地址。
mex 文件编写中的一点经验总结
mex 文件编写中的一点经验总结
首先得理解mex文件的意义,mex文件是C语言与matlab文件的接口文件,所以mex文件起到的作用就是把C语言的变量封装在mexfunction 提供的空间中,这样C语言即可利用mexfunction把变量封装在matlab能利用的空间中进行计算了,所以mex文件中mexfuntion起到的作用就是变量空间转换,C语言的作用就是计算功能。
mex文件的一般书写步骤:
(1).确定mex函数的调用语法
(2)定义计算函数,在定义函数的时候有一定的技巧,将变量尽量都设置为数组的形式,这样形参就是指针,因为mex函数返回值都是指针.0eg 定义一个函数完成求输入数据的平法的倒数可以这样定义void ec1(y[],x[]) {y[0]=1/x[0]*x[0];}
(3)书写mexfunction函数
void mexFunction(int nlhs, mxArray *plhs[],int nrhs,mxArray *prhs[]) {
1.定义变量用来给计算函数传递变量,以及用来表示变量空间的维数。
2.检查输入,输出变量的个数,利用nlhs,nrhs判断
3.检查输入变量是否是双精度的,
4.检查创建矩阵变量的维数
5.将创建的matlab 空间指针传递给先前定义的指针变量
6.调用计算子函数
7.返回函数值
}。
【生物数学】matlab中mcc和mex等编译命令
Matlab中mcc, mbuild和mex命令详解MATLAB编译及接口Matlab的mcc命令将m文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编译器)和exe文件,并在特定条件下可以自动调用mbuild或者mex。
Mex命令将入口函数为mexfunction()的C/C++文件编译成MEX(DLL)文件(需要C/C++编译器)。
Mbuild命令将入口函数为main()的C/C++文件生成可独立运行的C应用程序(需要C/C++编译器)。
对于64位的Windows平台,MATLAB没有现成的C编译器。
需要免费下载Microsoft Windows SDK编译器。
Microsoft Windows SDK for Windows 7 and .NET Framework 4下载地址:(需要联网安装):microsoft/en-us/download/details.aspx?id=8279安装前一定要卸载Microsoft Visual C++ 2010 x86 Redistributable - 10.0.30319以上版本的C++运行库,装完SDK7.1后需要安装VC-Compiler-KB2519277补丁::microsoft/zh-cn/download/details.aspx?id=4422 在使用mcc, mbuild和mex命令之前,首先要配置MATLAB使用Windows SDK进行C/C++语言编译,配置命令如下:mex -setup17mbuild -setup配置命令运行结果:>> mex -setupMEX 配置为使用'Microsoft Visual C++ 2012 (C)' 以进行C 语言编译。
警告: MATLAB C 和Fortran API 已更改,现可支持包含2^32-1 个以上元素的MATLAB 变量。
不久以后,您需要更新代码以利用新的API。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.2.2 为产生MEX文件进行预配置
要实现从M文件到MEX文件的转换,就必须先对M编译器进行正确设置。预 配置包括两个过程:一是根据外部编译器的类型、软件位置对M编译器进行设置; 二是利用MATLAB提供的标准文件对用户设置加以验证。
4
1. 对MATLAB编译器应用程序mex的配置
启动配置:在MATLAB指令窗口运行mex-setup 命令
在Windows的DOS窗口运行my_hello.exe文件查看其正确性。 D:\Documents and Settings\sllu\My Documents\MATLAB\MYFILE\mex\my_ex1 Hello,World
9.3 创建MEX文件
MEX文件的优点:
8
运行速度快,利用C代码实现循环体要比MATLAB快很多;
9.1.2 编译器的局限性
1. 2. 3. 不支持M脚本文件的编译。 不支持用户自定义的对象。 不支持eval,input,inline等函数。
3
4.
不支持Java接口。
9.2 编译器的安装和配置
9.2.1 配置MATLAB编译器的前提准备
1. 计算机必须安装有ANSIC/C++编译器。下面任何一种C/C++编译器均可。
2
编译器主要包括: 将C源码文件生成MEX文件的mex编译器; 将C源码文件生成可独立运行文件的mbuild编译器; 可以将M文件转换成C源码文件并调用mex或mbuild编译器生成MEX文件 或exe可执行程序的mcc编译器。
9.1.1 编译器的功能
1. 产生源代码,进而生成MEX文件。
MEX文件可以提高运行速度,并且可以隐藏文件算法,避免非法修改源文件。
9.3.1 C语言MEX文件的构成
mexFunction函数的参数含义为: nrhs:为输入参数的数目。 程序的构成主要由入口子程序和计算功能子程序两部分组成。 prhs:为输入参数数组,是指针数组。 (1) 入口子程序 nlhs:为输出参数的数目。 入口子程序必须是mexFunction,其构成形式为: plhs:为输出参数数组,是指针数组。
(2) 计算功能子程序
计算功能子程序包含所有的实际需要完成的功能源代码,可以是用户以前所编写 的算法和程序,以函数的形式存在。 C语言MEX文件必须包含mex.h库:#include”mex.h”。mex.h库中包含了C语言MEX文 件所需要的mex-函数和matrix.h库(定义了mx-函数)。 mex-和mx-函数是MATLAB提供与外界程序接口的函数。mx-函数用来实现MATLAB的 矩阵操作;mex-函数用来实现从MATLAB环境中获取矩阵数据并返回信息。
9.3.2 C语言MEX文件的建立
timestwo.c #include "mex.h“ /*计算功能子程序timestwo,计算一个数的两倍*/ void timestwo(double y[], double x[]) { y[0] = 2.0*x[0]; } /*入口子程序mexFunction*/ void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { double *x,*y; int mrows,ncols;
7
(1)验证mex应用程序
先将<matlab>\extern\example\cmath目录下的ex1.c文件复制到自己的目录 下,并改名为my_ex1.c。 >>mbuild my_ex1.c %生成my_ex1.exe文件
在Windows的DOS窗口运行my_ex1.exe文件查看其正确性。 D:\Documents and Settings\sllu\My Documents\MATLAB\MYFILE\mex\my_ex1
ans=
%运行my_yprime.dll文件
2.0000 8.9685 4.000 -1.0947
>>which my_yprime
%获得my_yprime.dll文件的位置信息
D:\Documents and Settings\sllu\My Documents\MATLAB\MYFILE\mex\my_yprime.dll >>clear my_yprime.dll %删除my_yprime.dll文件
/* 检查输入输出参数 */ if(nrhs!=1) { mexErrMsgTxt("One input required."); } else if(nlhs>1) { mexErrMsgTxt("Too many output arguments"); } /* 输入只能是一个双精度型的实数*/ mrows = mxGetM(prhs[0]); ncols = mxGetN(prhs[0]); if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) ) { mexErrMsgTxt("Input must be a noncomplex scalar double."); } /* 为输出参数创建矩阵,输出指针指向该矩阵 */ plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL); /* 输入指针输出指针赋值 */ x = mxGetPr(prhs[0]); y = mxGetPr(plhs[0]); /* 调用功能子程序 */ timestwo(y,x); }
6
9.2.2 为产生独立外部应用程序进行预配置
要实现从M文件到独立外部应用程序的转换,也必须先对MATLAB编译器进行 正确设置。预配置包括两个过程:一是根据外部编译器的类型、软件位置对 MATLAB编译器进行设置,同时对MATLAB C数学函数库进行选择;二是利用 MATLAB提供的标准文件对用户设置加以验证。 启动配置:在MATLAB指令窗口运行mbuild-setup 命令 Select a compiler: [1] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc [2] Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio [0] None Compiler: 2 The default options file: "D:\Documents and Settings\sllu\Application Data\MathWorks\MATLAB\R13\compopts.bat" is being updated from C:\MATLAB6P5\BIN\WIN32\mbuildopts\msvc60compp.bat...
对于已存在的C或FORTRAN子程序,可以通过MEX文件在MATLAB环境中直接调用, 而不必重新编写M文件 ;
对于A/D、D/A卡,或其它PC硬件,可以直接用MEX文件进行访问 ; 利用MEX文件,可以使用如Windows用户图形界面等资源。
创建MEX文件有两种方法:
利用C源码编辑器编写C语言MEX文件,经过mex命令编译链接得到MEX文件。 利用M文件编辑器编写M函数文件,经过mcc命令编译链接得到MEX文件。
>>mex-setup
Select a compiler: [1] Lcc C version 2.4 in C:\MATLAB6P5\sys\lcc [2] Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio [0] None Compiler:2 The default options file: "D:\Documents and Settings\sllu\Application Data\MathWorks\MATLAB\R13\mexopts.bat" is being updated from C:\MATLAB6P5\BIN\WIN32\mexopts\msvc60opts.bat... Installing the MATLAB Visual Studio add-in ... Updated D:\Program Files\Microsoft Visual Studio\common\msdev98\template\MATLABWizard.awx from C:\MATLAB6P5\BIN\WIN32\MATLABWizard.awx
Microsoft Visual C/C++5.0以上版本。
Borland C/C++5.0以上版本。
LCC C (MATLAB自带,只能用于生成MEX文件)。
2. 在安装MATLAB时,选中组件
MATLAB Compiler C/C++ Math Library MATLAB C/C++ Graphics Library
2.
产生C或C++源码,进而生成独立的外部应用程序(EXE文件)。
该程序无需MATLAB环境支持,如果源M文件使用了绘图指令,则需要图形库支持。
3. 产生C MEX的S函数。加快Simulink中自定义的S函数模块的运行速度。 4. 产生C共享库(动态链接库、DLL)或C++静态库。
它们的使用无需MATLAB环境支持,但需要MATLAB的数学库。
1. 对MATLAB编译器应用程序mbuild的配置