gunmex在matlab中的配置(WinGW和cygwin)
MATLAB C-MEX混合编程

1.对于大量现有的 C 或者 Fortran 程序可以无须改写(相对而言,修改的很 少,只需完成接口函数即可)成 MATLAB 专用的 M 文件格式而在 MATLAB 中执 行。
2.对于那些 MATLAB 运算速度过慢的算法,可以用 C 或者 Frotran 语言编写 以提高效率。
/* 在 MATLAB 命令行方式下,本 MEX 文件的调用格式是 y=timestwo(x) 输入参数(x)个数=1,输出参数(y)个数=1,所以在程序一 开始就检查 nrhs 是否=1 以及 nlhs 是否>1(因为 MATLAB 有一个缺省 输出参数 ans,所以 nlhs 可以=0 */
mrows = mxGetM(prhs[0]); /* 获得输入矩阵的行数 */ ncols = mxGetN(prhs[0]); /* 获得输入矩阵的列数 */ if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) )
timestwo(y,x); /* 调用 C 函数 timestwo(y,x) */ }
把上面这个文件 timestwo.c 编辑完成后,在 matlab 命令行里输入:
mex timestwo.c
matlab 会提示你选择一个编译器进行编译,如果安装了 VC,则选择 VC++即
可。编译完成后会在同一目录下生成同名的动态链接库文件 timestwo.mexw32。
例子
在 matlab 中的 EDIT 编辑如下文件,然后 save as timestwo.c。可以在 “<MATLABroot>\extern\example\mex”目录下找到其他的一些例子。
Matlab以MEX方式调用C源代码

Matlab以MEX方式调用C源代码/s/blog_468651400100coas.html如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:double add(double x, double y){return x + y;}现在我想要在Matlab中使用它,比如输入:>> a = add(1.1, 2.2)3.3000要得出以上的结果,那应该怎样做呢?解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。
MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。
可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。
该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。
所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。
值得注意的是,mex文件是与平台有关的,以我的理解,mex文件就是另类的动态链接库。
在matlab6.5中使用mex -v 选项,你可以看到最后mex阶段有类似如下的信息:--> "del _lib94902.obj"--> "del "test.exp""--> "del "test.lib""也就是说,虽然在matlab6.5生成的是dll文件,但是中间确实有过lib文件生成。
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[],
第8章MATLAB高级应用

8.4.2 Notebook启 Notebook启动
1. 创建M-book文件 1.创建 book文件 创建M 创建M book文件有两种方法 文件有两种方法: Word中启 创建M-book文件有两种方法:从Word中启 动和从MATLAB命令窗口启动 命令窗口启动。 动和从MATLAB命令窗口启动。 2. M-book的界面图 M-book的界面图 M-book的界面比普通的Word book的界面比普通的 的界面比普通的Word 多一个“Notebook”菜单。 多一个“Notebook”菜单。
第8章MATLAB高级应用 MATLAB高级应用
8.1 MATLAB应用接口 MATLAB应用接口 8.2 低级文件输入输出 8.3 图形文件转储 8.4 Notebook
8.1 MATLAB应用接口 MATLAB应用接口 8.1.1 MEX文件 MEX文件
MEX文件是由 MEX文件是由C或FORTRAN程序编译生成 文件是由C FORTRAN程序编译生成 也可以由M文件经由C源代码生成。 的,也可以由M文件经由C源代码生成。MEX 文件在M文件中可以直接调用。 文件在M文件中可以直接调用。 1. MEX文件系统设置 MEX文件系统设置 MEX文件的编写与编译需要两个条件 MEX文件的编写与编译需要两个条件:已经 文件的编写与编译需要两个条件: 安的MATLAB应用程序组件及相应的工具和合 安的MATLAB应用程序组件及相应的工具和合 适的C Fortran语言编译器 语言编译器。 适的C或Fortran语言编译器。 2. 测试配置
8.2.3读写二进制数据 8.2.3读写二进制数据
二进制数据格式不删除或添加分隔符,使用fread和 二进制数据格式不删除或添加分隔符,使用fread和 fwrite命令可以实现对二进制数据的读写 fwrite命令可以实现对二进制数据的读写。 命令可以实现对二进制数据的读写。 1.读数据 1.读数据 fread命令为读二进制数据 fread命令为读二进制数据。 命令为读二进制数据。 [a,count]=fread(fid,size,precision,skip) %读取二进制数据 2. 写数据 fwrite命令为写二进制数据。 fwrite命令为写二进制数据。 count=fwrite(fid,a,precision,skip) %写二进制数据
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 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中调试用C编写的MEX文件

在Matlab 中调试用C/C++编写的MEX 文件(32、64位机,VS2005和matlabR2010b)mex文件是matlab提供的与外部语言如C、C++提供的接口函数。
可以在Matlab环境下编写一个*.m文件,来编译所定的C/C++文件,当然,这个C/C++文件的开头是有要求的。
Mex函数有固定的自己的一套接口形式以VS2005和matlab R2010b 7.11.0版本为例,C/C++文件在matlab编译格式为*.mexw32,准备好你的C/C++文件后:[1]、matlab安装mex编译工俱命令如:mex –setup编译工具选择:VS2005;一路yes下来。
最后,只要不报错就可以。
[2]、在matab环境中,编写编译文件compile_mex .m把C/C++文件编译成*.mexw32文件时,要使用mex –g命令,产生具有调试信息的执行文件。
而不是mex –o命令,后者是不含调试信息的。
compile_mex.m 文件内容如下;function compile_mex(debug_flag)if strfind(computer(),'64')defs = '-DA64BITS '; % for 64bit machines - define pointer type elsedefs = '';endif verLessThan('matlab','7.3')defs = [defs, '-DmwIndex=int -DmwSize=size_t '];endif nargin>0 && debug_flagdebugs = ' -g ';sprintf('mex -g');elsedebugs = ' -O ';endcmd = sprintf('mex %s -largeArrayDims %s filename.cpp ', debugs, defs); eval(cmd);在命令行执行:debug_flag =’1’, compile_mex(debug_flag)生成了:filename .mexw32和filename.mexw32.pdb;如果不需要产生调试信息:在命令行做无参数执行:compile_mex生成了:filename .mexw32,但没有生成filename.mexw32.pdb;[3]、确定matlab打开。
MatlabMex文件调试

MatlabMex文件调试
8Q:如何调试 C MEX S-Functions:(Microsoft Visual C/C++ .NET)
8A:
1、 mex –setup选择编译器 Visual C/C++ .NET。
2、 mex –g ***.c编译mex文,此命令产生***.mexw32文件。
3、打开microsoft开发环境,不退出matlab。
4、VC中,选择tools-->debug Process;选择matlab.exe并attach;在打开的对话框中选择Native,点击Ok。
5、通过File——> open ——> ***.c打开源文件。
6、在合适之处设置断点。
参考文献:网页Support - How Do I Debug C MEX S-Functions.htm
注意事项:
1、每一次改动完mex文件后,应该终止调试,重新编译,才能真正保存改动,以新的文件进行调试运行。
2、 mex中对于输入的矩阵元素值按列索取。
3、 mex文件中的所有的变量声明需在所有执行语句之前。
4、已进入调试状态下,进行mex –g/-v ***.c编译会出错,应该注释掉。
matlab mingw fortran编译

matlab mingw fortran编译如果你想在Matlab中使用MinGW工具链来编译Fortran代码,你需要进行一些设置和步骤。
以下是一般的步骤:1. 安装MinGW:下载MinGW。
你可以从MinGW的官方网站或者一些第三方网站下载。
安装MinGW。
通常,你只需要按照提示进行默认安装即可。
2. 配置Matlab:确保Matlab知道MinGW的位置。
你可以通过设置`MW_MINGW_PREFIX`环境变量来告诉Matlab MinGW的安装位置。
例如,如果你的MinGW安装在`C:\MinGW`,你可以在Matlab命令窗口中输入:```matlab`setenv('MW_MINGW_PREFIX','C:\MinGW')````3. 设置Fortran编译器:在Matlab中,你可以使用`addpath`命令来添加Fortran文件的路径到Matlab的路径中。
例如:```matlab`addpath('你的Fortran文件路径')````4. 编译Fortran代码:在Matlab中,你可以使用`mex`命令来编译Fortran代码。
例如:```matlab`mex -I你的Fortran文件路径 -L你的Fortran文件路径 -l 你的库名你的Fortran文件名.f90````5. 运行编译的程序:一旦你成功编译了Fortran代码,你可以像运行其他Matlab程序一样来运行它。
6. 注意事项:确保你的Fortran代码是兼容MinGW的。
有些Fortran代码可能使用了特定于特定编译器的特性或函数,这可能会在MinGW上导致问题。
在某些情况下,你可能需要安装额外的库或工具,以便在MinGW上正确编译Fortran代码。
这可能包括特定的Fortran运行时库或特定的Fortran编译器。
7. 错误和问题:如果在编译过程中遇到错误,仔细阅读错误消息并尝试解决问题。
基于MATLAB编译器和MEX文件的VC_与MATLAB混合编程

(3)MATLAB 引擎。MATLAB 引擎采用客户机/服务 器(Cபைடு நூலகம்ient/Sever) 的方式,提供了一组 MATLAB API 函数, 通过调用这些函数实现程序进程之间的数据传递。在运用中, 让 VC++程序作为前端客户机,它向 MABLAB 引擎传递命令 和数据,并从 MATLAB 引擎接受数据信息,实现动态通讯。
} if(!libmatrixpInitialize() ) {
std::cerr << "不能初始化库!"<< std::endl; _getch(); return -1; } else { try { double data[4096]; // 创建数组 for (int i=0;i<4096;i++) data[i] = i; mwArray in1 ( 64 , 64 , mxDOUBLE_CLASS , mxREAL); mwArray in2 ( 64 , 64 , mxDOUBLE_CLASS , mxREAL); in1.SetData(data, 4096); in2.SetData(data, 4096); mwArray out; addmatrix(1,out,in1,in2); // 调用库函数 std::cout << "The value of added matrix is:" << std:: endl; std::cout << out << std::endl; multiplymatrix(1, out, in1, in2); std::cout << "The value of the multipliedmatrix is:"<< std::endl; std::cout << out << std::endl; } catch (const mwException& e) {
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即可。
matlab与vc混合编程(绝对无误)

matlab与vc混合编程1、环境设置在桌面上右键单击“我的电脑”图标出现以下菜单单击“属性”菜单项,出现“系统特性”对话框,单击“高级”选项卡,如下图所示在上图中,单击“环境变量”按钮,出现“环境变量”对话框,添加系统变量 matlab 值为 D:\MATLAB 即 matlab 的安装路径,如下图所示在环境变量 path 中加入 D:\MATLAB\bin\win32 ,如下图所示按“确定”完成设置后,重启计算机或注销当前用户,即可应用新设置。
2、matlab 编译器设置(1) mex 命令设置(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mex -setup ”命令后,按回车键,安装 matlab 编译器;(b) 命令窗口出现如下提示mex -setupPlease choose your compiler for building external interface (MEX) files:Would you like mex to locate installed compilers [y]/n?此时键入”y”,按回车;(c) 命令窗口出现如下提示Select a compiler:[1] Digital Visual Fortran version 6.0 in C:\Program Files\Microsoft Visual Studio[2] Lcc C version 2.4.1 in D:\MATLAB\sys\lcc[3] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Studio[4] Open WATCOM C/C++ version 1.3 in D:\Maple11[0] None此时键入”3”,按回车;选择 Microsoft Visual C++6.0 的编译器(d) 命令窗口出现如下提示Please verify your choices:Compiler: Microsoft Visual C/C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):此时键入”y”,按回车;确认选择 Microsoft Visual C++6.0 的编译器(2) mbuild 命令设置(a) 运行 matlab ,在 matlab 的命令窗口 (Command Window) 键入“ mbuild -setup ”命令后,按回车键,安装 matlab 编译器;(b) 命令窗口出现如下提示mbuild -setupPlease choose your compiler for building standalone MA TLAB applications:Would you like mbuild to locate installed compilers [y]/n?此时键入”y”,按回车;(c) 命令窗口出现如下提示Select a compiler:[1] Lcc C version 2.4.1 in D:\MATLAB\sys\lcc[2] Microsoft Visual C/C++ version 6.0 in C:\Program Files\Microsoft Visual Stu dio[0] None此时键入”2”,按回车;选择 Microsoft Visual C++6.0 的编译器(d) 命令窗口出现如下提示Please verify your choices:Compiler: Microsoft Visual C/C++ 6.0Location: C:\Program Files\Microsoft Visual StudioAre these correct?([y]/n):此时键入”y”,按回车,确认选择 Microsoft Visual C++6.0 的编译器,编译器设置完成。
用mex文件实现VC和Matlab的混合编程

用mex文件实现VC和Matlab的混合编程一个mex程序实际上就是一个特别的DLL,它的输出函数为mexFunction。
那么在VC中就可以用Project wizard建立一个DLL工程,并为指定输出为mexFunction.1. 建立新的DLL工程启动VC,选择菜单File/New,在Projects页面中选择MFC AppWizard(DLL),输入路径名和工程名,并单击OK按钮。
2. 选用静态链接的MFC类库在接下来的对话框中,选择使用静态链接MFC的DLL。
这是因为,MATLAB 使用了特殊片本的DLL文件mfc42.dll,并且放置在其程序中目录中,MATLAB 必须使用自带的mfc42.dll文件,而这个文件与Windows系统目录中的相应文件是不兼容的,、用其中一个替换另一个,将会导致Windows系统工作不正,或MATLAB工作的不正常,严重时甚至造成MATLAB非法操作而异常退出。
而用静态链接就不会出现这个问题。
3. 设定输出函数AppWizard将会自动生成如下几个文件:A. Mextest.cppB. Mextest.defC. Mextest.rcD. StdAfx.cpp (前三个的名字与项目文件名有关)需要在mextest.def中指定该DLL文件的输出函数,也就是mexFunction。
为此VC的Workspace栏中,单击“FileView”属性页,展开“Sourse File”栏,打开文件mextest.def,将其内容进行编辑,在“Exports”后面加入mexFunction 一行。
下面是编辑后的mextest.def文件的内容:;mestest.def : Declares the module parameters for the DLL.LIBRARY “mextest”DESCRIPTION …mextest Windows Dynamic Link Library‟EXPORTS; Explicit exports can go heremexFunction4. 环境设置由于在编译和链接mex程序时,需要链接MATLAB提供的若干头文件,因此应该对这些文件的搜索路径进行指定。
Matlab2015b使用MinGW64(TDM-GCC)编译mex

You can use the MinGW-w64 version 4.9.2 compiler from TDM-GCC to build MEX files and standalone MATLAB® engine and MAT-file applications.Installing Compiler from Add-Ons MenuTo install the MinGW compiler, open the installer from MATLAB Add-Ons menu. On the Home tab, in the Environment section, click the Add-Ons icon. Under Refine by Type, select Features, or search for MinGW. Follow the prompts to add the compiler.Note:To install the MATLAB-supported version of MinGW-w64, you must clear the check box highlighted in the following figure.MinGW Installation Folder Cannot Contain SpaceDo not install MinGW in a location with spaces in the path name. For example, do not use:C:\Program Files\TDM-GCC-64Instead, use:C:\TDM-GCC-64Troubleshooting and Limitations Compiling C/C++ MEX Files withMinGW-w64Do Not Link to Library Files Compiled with Non-MinGW CompilersIf you use the MinGW compiler to build a MEX file that links to a library compiled with a non-MinGW compiler, such as Microsoft® Visual Studio®, the file will not run in MATLAB®. Library (.lib) files generated by different compilers are not compatible with each other.You can generate a new library file using the dlltool utility from MinGW.MinGW Compiler Not Setup for Use with MEXIf you installed the MinGW compiler but MATLAB does not recognize it, the compiler might not be the supported version.To install the MATLAB-supported version of MinGW-w64, you must clear the Check for updated files on the TDM-GCC server check box. This check box appears during TDM-GCC Setup when you are asked to Choose which action you want the setup wizard to perform. For information about installing MinGW, see Installing Compiler from Add-Ons Menu.MinGW Installation Folder Cannot Contain SpaceDo not install MinGW in a location with spaces in the path name. For example, do not use: C:\Program Files\TDM-GCC-64Instead, use:C:\TDM-GCC-64MEX Command Does not Choose MinGWIf you only have the MinGW compiler installed on your system, the mex command automatically chooses MinGW for both C and C++ MEX files. If you have multiple C or C++ compilers, use mex-setup to choose MinGW for both C and, if required, C++ MEX files.mex-setupmex-setupcppIf you only type mex -setup choosing MinGW, when you compile a C++ file, mex might choose a different compiler.Manually Configure MinGW for MATLABMATLAB detects the MinGW compiler by reading an environment variable, MW_MINGW64_LOC. When you install MinGW from the MATLAB Add-Ons menu, MATLAB sets this variable.If necessary, you can set this variable globally, if you have Windows® administrative privileges, using the Windows Control Panel. Alternatively, set the variable every time you open MATLAB.Note:Verify you have installed MinGW-w64 version 4.9.2 before setting the environment variable.Set variable using Windows Control PanelTo set the environment variable on Windows 7:1. Make sure you have administrative privileges.2. Select Computer from the Start menu.3. Choose System properties from the context menu.4. Click Advanced system settings > Advanced tab.5. Click Environment Variables.6. Under System variables, select New.7. In the New System Variable dialog box, type MW_MINGW64_LOC in the Variablename field.8. In the Variable value field, type the location of the MinGW-w64 compiler installation, forexample, C:\TDM-GCC-64.9. Click Ok to close the dialog boxes, then close the Control Panel dialog box.Set variable for MATLAB sessionTo set the environment variable in MATLAB, type:setenv('MW_MINGW64_LOC',folder)where folder is the installation directory, for example, 'C:\TDM-GCC-64'. You must set the variable every time you run MATLAB.。
matlab与cc++混合MEX的编程

matlab与cc++混合MEX的编程matlab中矩阵预算特别⽅便,但如果有⽆法避免的循环甚⾄多层嵌套的话,会⾮常影响程序的效率,因此通常会将这种需要⼤量循环的模块⽤c++编写然后在matlab中调⽤。
matlab中的的c++编程称为mex编程(matlab executive),其中需要些⼀个c++⽂件,然后在matlab中⽤mex命令编译它,然后就可以在matlab中像调⽤函数⼀样调⽤c++代码了。
要使⽤mex编译,⾸先要在matlab中配置c++编译器,如果你的计算机中已经安装了某个c++编译器(例如vs或者gcc),在matlab命令⾏中直接输⼊"mex -setup"就会有相应的提⽰,然后选择下⼀步确定,编译器就设置成功了。
接着就可以开始编写mex的c++⽂件了,下⾯举个例⼦,新建⼀个名为test.cpp的c++⽂件,代码内容如下:#include "mex.h"void mexFunction(int nlhs,mxArray* plhs[],int nrhs,mxArray* rhs[]){printf("hello world!");} mex的源⽂件⼀定要include头⽂件"mex.h“,mex源⽂件的⼊⼝函数为void mexFunction,这个函数有四个参数:nlhs(n left hand side)等号左边参数个数,plhs(pointer left hand side)等号左边参数指针,另外两个参数是等号右边的个数和指针。
因为mex编译完成之后在matlab中是当函数⽤的,函数就有输⼊参数和返回参数,输⼊参数就是等号右边的参数,输出参数就是等号左边的参数,matlab中的函数允许有多个返回值,所以nlhs可以⼤于⼀。
注意,指针plhs和prhs的类型为mxArray*,这是mex.h中定义的⼀种数据类型,是matlab⾥矩阵在c++源⽂件中的表⽰。
【生物数学】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。
Windows下Cygwin和MinGW的基本命令

一.Cygwin的使用:1.C文件编译:(1).C文件的创建命令:① "notepad" + "文件名" + ".后缀名" 【例:"notepad example.c"】;② 当弹出一个询问窗口,选择“是”即可,然后即可输入源程序代码,点击保存后关闭窗口即可;③ 注:若要打开已有文件,同样使用此指令。
(2).C文件的编译命令:方法一:① "gcc" + "文件名" + ".后缀名" 【例:"gcc example.c"】;②注:此时生成的可执行文件名均为:a.exe 。
方法二(同C++的编译指令相同,从2中即可看出):①"g++" + "文件名" + ".后缀名" + "‐o" + "可执行文件名"【例:"g++ example.c ‐o example"】;② 注:此时生成的可执行文件名即为:example.exe 。
(3).C文件的执行命令:"./" + "可执行文件名(加上与不加上后缀名均可)"【例:"./a" 或 "./a.exe" 或 "./example" 或 "./example.exe"】。
2.C++文件的编译(与C文件类似,只是在编译时的指令略有差别,上已说明。
本部分,略之。
)3.Fortran文件的编译:(1).Fortran文件的创建命令:"notepad" + "文件名" + ".后缀名"注:Fortran分为两种格式(Fixed Format 与 Free Format),前者的后缀名为“.f”或“.for”,后者的后缀名为“.f90”。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
gunmex在matlab中的配置(WinGW和cygwin)在Window xp/7下使用Linux的C/C++代码,编译成DLL供Matlab混合编程使用,目前有两个window 下的编译器cygwin和WinGW,这两个编译器都可以在Window下模拟Linux环境,并对C(gcc)和C++(g++)进行编译,cygwin以及WinGW,如果是混合Matlab编程,个人推荐使用WinGW,安装简单,使用方便。
以下是总结一些网上的文章,对我们初学者有些帮助,在此一并感谢原作者。
在windows下用的g++编译器,以前用过这方面的MinGW,今天上网下载这个程序,发现这边的网速不行,因为它支持的是在线安装。
在/上可以看到其安装程序。
里面的开发包都好老,在经历了很多次失败后,我决定手工安装。
一.手工安装方法:来自/articles/windows%E4%B8%8Bmingw%E7%9A%84%E5%AE%89%E8%A3%85 %E4%B8%8E%E4%BD%BF%E7%94%A8.htmlMinGW提供了一个编写Windows应用程序的完整开源工具包。
1)MinGW的安装MinGW的安装,其实非常简单。
因为手动安装有着更多的灵活性,所以这里重点说一下手动安装的步骤。
安装MinGW至少需要四个包:* binutils* gcc-core* mingw-runtime* w32api把这些包下载下来,放到C:/MinGW目录下(当然,放到哪里都一样),然后在windows的cmd里,用下面的命令解压出来:C:/MinGW>gzip -d -c binutils-2.17.50-20060824-1.tar.gz | tar xC:/MinGW>gzip -d -c gcc-core-3.4.5-20060117-3.tar.gz | tar xC:/MinGW>gzip -d -c mingwrt-3.15.1-mingw32-dev.tar.gz | tar xC:/MinGW>gzip -d -c w32api-3.12-mingw32-dev.tar.gz | tar xC:/MinGW> set path=C:/MinGW/bin;%path%其实各个包的目录结构都是一样的,所以,解压后的目录结构仍然为一样的。
其它的包也可以采用这样的方法来处理。
只是要知道,我们解压是需要把这几个包混合起来,而不要只是习惯性的分别解压到一个文件夹里!这个时候,最好推荐用命令行的方式来解压,不容易出错;如果系统没有装gzip或是类似的软件,可以用Cygwin来解压。
最后一行命令是添加path到环境变量里,如果你经常使用,需要把这个变量永久的添加到path变量里。
当然,你可以根据你的需要选择更多的包,例如说gcc-g++ for C++、gcc-objc for Objective C、gcc-g77 for Fortran 77、gcc-java for Java或gcc-ada for Ada。
如果需要这些包的话,只需要在上面的命令里多解压一个包即可。
2)MinGW的使用现在我们可以直接在windows cmd里来使用gcc之类的命令来编译程序了。
比如说下面这个C程序:#include<stdio.h>intmain(intargc, char **argv){printf (“Start to use MinGW”);return (0);}假如你想从hello.c生成一个在终端模式下的可执行文件hello.exe。
只要直接用gcc编译器进行编译就行了:gcc-chello.c这个命令把hello.c编译成一个目标文件hello.o,然后用下面的方法生成一个可执行文件hello.exe:gcc-o hello hello.o事实上,作为一种选择,你可以使用下面的命令把编译和链接放到一步中完成:gcc-o hello hello.c下面是一个简单的c++程序的代码示例,复制并粘贴到一个叫hello.cpp的文件中试试看:#include<iostream>intmain(intargc, char **argv){std::cout<< “Start to use MinGW to compile C++” <<std::endl;return (0);}对于c++程序来说,可以使用g++来编译和链接:g++-c hello.cppg++ -o hello hello.o对于gcc、g++及其他编译器的使用,可以查询各自的手册以获得更多的帮助。
二.配置在matlab下调用gcc编译器软件下载地址: https:///projects/gnumex软件安装和使用说明: /软件功能:在MATLAB上调用MinGW或Cygwin编译C和Fortran的mex代码。
这就意味着,我们可以在MATLAB上编译Linux的C程序代码和调用Linux的库编译出MATLAB能用的Mex程序。
Whata nice tool!安装步骤:1. Sourceforge上下载软件,目前最新版2.01。
解压缩到任意一个固定的目录。
如C:/MATLAB/gnumex2. 运行MATLAB,把上面的目录加入到MATLAB的path中。
3. MATLAB上输入命令gnumex运行安装设置。
设置很简单,主要是一下几个方面- MinGW的root目录(如果使用的是MinGW的gcc,这里必须设置正确)- Cygwin的root目录(同上,使用时设置,否则留空)- f95 和gfortran的目录(有的话就设置,没有的话留空。
这个是编译fortran程序选用的编译器)注意: gfortran是gcc的一个组件,这个一般都有,就在MinGW的root目录/bin下面。
最好选上,有备无患。
- linking环境这里选用mingw或cygwin根据自己的需要设置。
注意-mno-cygwin这一项是指在cygwin 中link的时候使用windows的lib. 据说这个Cygwin gcc的option争议很大,功能不健全,在官方的maillist 上要求取缔此项功能的言论很多,虽然目前仍然在更新和支持中。
所以,建议还是使用MinGW比较好。
- 语言方便,选用自己需要的C/C++或fortran语言。
- Generate 里选择mexdll. 这个一般是默认的。
当然mex也可以编译成exe文件。
根据需要选择。
建议使用mexdll。
这个可以再matlab上像一般函数一样直接调用程序,很方便。
关于最后的两个路径,建议默认。
最后一个mexopts.bat的路径是MATLAB默认的mex程序设置路径,我们覆盖这个文件将使我们的设置成为mex的默认设置。
这样就可以直接调用mex编译,如mex你的命令而不用加参。
加参使用的方法如:mex -f 你的mex设置文件.bat 你的命令如果你不想改变默认的mex设置,也可以把这个文件保存在其他方便的位置。
需要的时候使用-f 参数调用。
设置完成后,按make option file确认即可。
提示:1- 如果想重新设置MATLAB的mex.可以使用mex -setup 设置。
这是matlab的默认命令和gnumex无关。
2- 如果要查看当前mex的设置情况,可以使用mex -v 来查看。
3- 你可以在gnumex的File菜单下,选择save config保存当前的设置界面信息到gnumexcfg.mat中。
下次修改的时候可以使用菜单上的Load config调用。
测试运行:先检查一下mex的设置是否生效mex -v我们看到MATLAB = D:\MATLAB~1-> COMPILER = gcc-> Compiler flags:COMPFLAGS = -c-DMATLAB_MEX_FILEOPTIMFLAGS = -O3DEBUGFLAGS = -g看到上面的gcc了吗,这说明我们的设置已经生效了,现在mex用的是gcc为编译器。
做个c程序的例子复制MATLAB根目录下extern\examples\mex\yprime.c文件到自己的测试目录下。
例如gnumex的examples目录下。
输入命令mexyprime.c就完成了编译工作,生成yprime.mexw32 文件。
我们可以在MATLAB上调用这个程序运行看看。
yprime(1,1:4)ans =2.0000 8.9685 4.0000 -1.0947提醒: MATLAB对命令的优先级是,当前目录下的程序最优先。
使用技巧:1. 如果你使用的是cygwin,注意一定要把cygwin里的cygwin1.dll文件(在root的bin里面) 加入到windows 的path里(而不是matlab的path里)。
因为cygwin的程序需要调用这个动态链接库才能使用。
这也是cygwin的不方便之处,而且会影响程序的运行速度。
最重要的是,目前该软件对cygwin的版本支持很老(只支持cygwin的gcc 3.2),现在的4.x都不支持。
所以建议使用MinGW吧。
那个没版本限制,我已经成功的和最新的gcc4.4.1兼容了。
2. 如果测试程序删不掉,如yprime.mexw32文件无法删除,说明matlab运行了这个程序而没有卸载。
我们在MATLAB上输入clear yprime。
然后就可以正常删除了。
3. gcc有很多的options,和注意事项。
如果大家想更好学习gcc。
建议参考官方的文档/onlinedocs/,也可以找一份中文的参考文档慢慢研究。
gnumex的gcc使用的默认的options是-O3 -mcpu=pentium -malign-double-fno-exceptions需要什么option, 大家可以手动修改mexopts.bat文件。
(高级用户使用,不熟悉gcc的人慎用)4. 调用LAPACK/BLAS的方法。
建议直接调用MATLAB里提供的lib静态库。
位置在extern/lib/win32/microsoft/ 分别是libmwlapack.lib 和libmwblas.lib. 使用的时候可以直接输入全地址调用,也可以用-lmwlapack-lmwblas作为MATLAB的option使用(放在最后)。
如果想用自己优化过的lapack 和blas库,使用的时候可以直接输入全地址。
也可以把他们改名,前面加lib,然后复制到上面提到的位置下,通过-l调用。
例如: 你有optlapack.lib文件,改名为liboptlapack.lib 放到extern/lib/win32/microsoft/ 下。