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外部接口编程创建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 mex编译cu
matlab mex编译cu
标题,使用MATLAB MEX编译CUDA代码。
在MATLAB中,我们可以使用MEX函数来编译和链接C、C++或者CUDA代码,以便在MATLAB环境中运行。
本文将介绍如何使用MEX来编译CUDA代码,以便在MATLAB中利用GPU加速运行。
首先,我们需要编写CUDA代码,并保存为.cu文件。
在编写CUDA代码时,需要遵循CUDA的语法和规范。
接下来,我们需要创建一个MATLAB MEX函数,该函数将调用CUDA代码并将其编译为可在MATLAB中运行的格式。
在编写MEX函数时,我们需要包含mex.h头文件,并使用mexcuda命令来编译CUDA代码。
在编译时,需要指定CUDA的架构和编译选项,以确保代码能够在目标GPU上正确运行。
一旦编译成功,我们就可以在MATLAB中调用该MEX函数,并利用GPU加速运行CUDA代码。
通过这种方式,我们可以充分利用GPU 的并行计算能力,加快运行速度并提高计算效率。
总之,使用MATLAB MEX编译CUDA代码是一种在MATLAB中利用GPU加速运行CUDA代码的有效方法。
通过合理地编写和编译CUDA 代码,我们可以充分发挥GPU的计算能力,加速运行速度,并在MATLAB环境中进行高效的并行计算。
matlab mex文件反编译
MATLAB MEX文件反编译1. MEX文件是什么?在MATLAB中,MEX文件是一种用C、C++或Fortran语言编写的可调用函数,可以与MATLAB代码进行交互。
MEX文件可以提高MATLAB代码的执行效率,因为它们可以使用底层语言编写,从而利用底层硬件和操作系统的特性。
2. MEX文件的应用场景MEX文件通常用于需要高性能计算的任务,如图像处理、信号处理、数值计算等。
通过编写MEX文件,用户可以在MATLAB中使用其它编程语言的特性,提高程序的运行效率。
3. MEX文件的反编译MEX文件一直以来都是MATLAB用户关注的话题,因为MEX文件的源代码通常是关闭的,无法直接获取。
但是有时候,我们可能需要查看MEX文件的源代码,以便了解其实现原理或修改其功能。
这就需要进行MEX文件的反编译。
4. 反编译的方法实际上,MEX文件的反编译是一项复杂的任务,因为MEX文件是经过编译的二进制文件,包含了底层语言的机器码。
常见的反编译方法有静态分析和动态分析两种。
静态分析通常是通过逆向工程的方式来尝试还原MEX文件的源代码,而动态分析则是在运行时监视MEX文件的行为,并从中获取相关信息。
5. 静态分析的挑战静态分析的挑战在于理解MEX文件的结构和机器码对应关系。
由于MEX文件的编写语言多样,其结构也各不相同,这就给静态分析带来了很大的挑战。
编译器优化和加密技术也会使得静态分析变得更加困难。
6. 动态分析的优势相比之下,动态分析的优势在于能够直接观察MEX文件的运行时行为,从而获取到更加直观和准确的信息。
动态分析可以利用调试器、虚拟机监视器等工具来动态跟踪MEX文件的执行流程和内存访问情况,从而逐步还原其源代码。
7. 我的观点个人认为,尽管MEX文件的反编译技术存在一定的挑战,但随着逆向工程技术的发展和成熟,我们有望在未来找到更多有效的方法来进行MEX文件的反编译。
MATLAB官方也在不断加强对MEX文件的保护措施,以防止源代码的泄露和篡改。
MEX文件简介
【生物数学】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。
mex文件
mex文件目录1 1. MEX的编写2 2、MEX的编译3 3、MEX的调用4 4、MEX环境配置MEX从字面上是MATLAB和Excutable 两个单词的缩写。
.MEX文件是一种可在matlab环境中调用的C(或fortran)语言衍生程序,MEX文件的后缀名按32位/64位分别为 .mexw32/.mexw64。
MEX文件是由C或Fortran语言编写的源代码,经matlab编译器处理而生成的二进制文件。
它是可以被matlab解释器自动装载并执行的动态链接程序,类似windows下的dll文件。
MEX文件实现了一种其它语言与MATLAB的接口,通过MEX文件可以在MATLAB中像调用内嵌函数一样调用使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能提高MATLAB环境中数据处理的效率。
mex文件 - 1. MEX的编写mex的编译结果实际上就是一个带输出函数mexFunction 的dll文件,所以写MEX程序其实就是写一个DLL程序。
编写MEX程序的编辑器可以使用MATLAB的代码编辑器,也可使用自己的C++编辑器,如VS2008等。
a. MEX文件格式#include "mex.h"void mexFunction ( int nlhs, mxArray *plhs[], int nrhs, const mxArr ay *prhs[] ){}四个参数分别用来输出和输入数据: nlhs 输出参数个数,plhs 输出参数指针 (nrhs 和prhs是输入参数相关的)。
注意: 对输出和输入参数的操作都是通过指针的方式进行的。
b. 操作输入数据对输入数据进行操作,需要通过MEX函数mxGetPr 得到数据的指针地址。
mxGetM 和mxGetN 得到矩阵数据的行和列 (返回整数)。
对于实矩阵,我们可以定义 double *M; 来对实矩阵数据操作。
matlab mex反编译
matlab mex反编译
MATLAB MEX文件是一种由C/C++语言编写的程序,它可以作为MATLAB的扩展功能,以加速一些特定的计算任务。
然而,有时候我们可能会遇到需要反编译MEX文件的情况,以便了解其内部实现或者重新编写自己的版本。
反编译MEX文件并不是一项简单的任务,需要具备一定的编程知识和技能。
下面是一些大致的步骤:
1. 下载并安装MATLAB编译器和Visual Studio C++(或其他支持的编译器)。
2. 打开MATLAB,输入命令“mex -setup”,按照提示配置编译器。
3. 打开MEX文件所在的文件夹,找到“mex.bat”文件,双击运行。
4. 在Visual Studio C++中打开生成的.sln文件,查看和修改代码。
5. 修改完成后,保存并关闭Visual Studio C++。
6. 在MATLAB中输入命令“mex filename.c”,编译修改后的代码。
7. 如果编译成功,将生成一个新的MEX文件,可以在MATLAB中使用。
需要注意的是,反编译MEX文件可能会涉及到版权和法律问题,因此在进行反编译之前,请确保你有合法的权限和充分的理由。
此外,由于MEX文件是由C/C++语言编写而成,需要具备一定的编程技能和经验,否则修改可能会带来不可预料的结果。
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即可。
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与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。
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库文件目录地址。
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编译会出错,应该注释掉。
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的函数,该函数接受两个输入参数和一个输出参数。
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;}/*保存输入数值列阵大小。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.000 -1.0947
D:\Documents and Settings\sllu\My
9.D2o.cu2men为ts\产MAT生LAB独\MYF立ILE外\me部x\m应y_y用pri程me_序m.d进ll 行预配 置 要实现从M文件到独立外部应用程序的转换,也必须先对MATLAB编译器进
行正确设置。预配置包括两个过程:一是根据外部编译器的类型、软件位置对 MATLAB编译器进行设置,同时对MATLAB C数学函数库进行选择;二是利用MATLAB提 供的标准文件对用户设置加以验证。
ans=
>>which 2m.y00_0y0prim8e.9685 4.0%0获0 得m-y1_.y0p9r4i7me.dll文件的位置信息
D:\Documents and Settings\sllu\My
D>oc>ucmleenatrs\MATmLyA_By\pMrYiFImLeE.\dmlelx\my_y%p删ri除mem.yd_lylprime.dll文件
>>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 TChoempdielfearu:l2t 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...
(1)验证mex应用程序
先将<matlab>\extern\example\mex目录下的yprime.c文件复制到自
己的目录下,并改名为my_yprime.c。
>>mex my_yprime.c
%由my_yprime.c文件生成my_yprime.dll文
件
>>my_yprime(1,1:4)
%运行my_yprime.dll文件
编译器主要包括:
将C源码文件生成MEX文件的mex编译器;
将C源码文件生成可独立运行文件的mbuild编译器;
可以将M文件转换成C源码文件并调用mex或mbuild编译器生成MEX文件 或exe可执行程序的mcc编译器。
9.1.1 编译器的功能
1. 产生源代码,进而生成MEX文件。
MEX文件可以提高运行速度,并且可以隐藏文件算法,避免非法修改源文件。
(2)验证mcc应用程序
先将<matlab>\extern\example\mex目录下的yprime.m文件复制到自己 的目录下,并改名为my_yprime_m.m。
>>mcc-x my_yprime_m
6
>>my_yprime_m(1,1:4)
ans= 2.0000 8.9685
>>which my_yprime_m
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
1
MATLAB
九
编译器概述
、
编译器的安装和配置
编
创建MEX文件
译
器 和
创建独立的外部程序EXE文件
Notebook
Notebook
9.1 编译器概述
2
MATLAB编译器(The MATLAB Compiler,MCC)可以将M文件转化为C或C++ 源代码,然后进一步编译链接成MEX文件或可执行程序或共享库文件。编译后可以大 大提高程序的运行效率,甚至可以脱离MATLAB环境运行程序。
2. 验证配置的正确性
5
验证分两步进行:首先验证mex命令是否c命令是否可以将M文件转换成MEX文件。mcc命令可以在M文件转换成C
源码后,自动调用mex命令,将C源码转换成MEX文件。
利用MATLAB自带的yprime.c和yprime.m来验证mex和mcc命令。
9.2.2 为产生MEX文件进行预配置
4
要实现从M文件到MEX文件的转换,就必须先对M编译器进行正确设置。 预配置包括两个过程:一是根据外部编译器的类型、软件位置对M编译器进行设 置;二是利用MATLAB提供的标准文件对用户设置加以验证。
1. 对MATLAB编译器应用程序mex的配置
启动配置:在MATLAB指令窗口运行mex-setup 命令
9.1.2 编译器的局限性
3
1. 不支持M脚本文件的编译。
2. 不支持用户自定义的对象。
3. 不支持eval,input,inline等函数。
4. 不支持Java接口。
9.2 编译器的安装和配置
9.2.1 配置MATLAB编译器的前提准备
1. 计算机必须安装有ANSIC/C++编译器。下面任何一种C/C++编译器均可。
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
2.
产生C或C++源码,进而生成独立的外部应用程序(EXE文件)。
该程序无需MATLAB环境支持,如果源M文件使用了绘图指令,则需要图形库支持。
3. 产生C MEX的S函数。加快Simulink中自定义的S函数模块的运行速度。 4. 产生C共享库(动态链接库、DLL)或C++静态库。
它们的使用无需MATLAB环境支持,但需要MATLAB的数学库。