数字图像处理第一章MATLAB混合编程资料_第1页
数字图像处理第一章MATLAB混合编程资料_第2页
数字图像处理第一章MATLAB混合编程资料_第3页
数字图像处理第一章MATLAB混合编程资料_第4页
数字图像处理第一章MATLAB混合编程资料_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一章 MATLAB混合编程 第一节 概述 Matlab是当今世界上使用最为广泛的数学软件,它具有相当强大的数值计算、数据处理、系统分析、图形显示,甚至符号运算功能,是一个完整的数学平台。在这个平台上,只需寥寥数语就可以完成十分复杂的功能,大大提高了工程分析计算的效率。另外由于Matlab的广泛使用,于是出现了为各个领域专门使用的工具箱(即在某一研究领域常用数学工具的函数包),这些工具箱的出现更加促进了Matlab的流行。 Matlab强大的功能只能在它所提供的平台上才能使用,必需在安装有matlab系统的机器上使用.m文件,这样就给工程计算带来了很大不便;特别是在matlab中,使用的行解释

2、方式执行代码,这样大大地限制了代码执行速度。 能否开发一个matlab与其他高级语言的接口,这样就可以把matlab的强大功能融入各种应用程序中,并且通过高级语言编译器编译为二制代码,提高了执行速度。matlab的5.1版本提供了自带的C+ Complier,同时MathTools公司也为Matlab开发了m文件高效解释和调试IDE:MIDEVA。经过近两年的发展,matlab 5.3 中的C complier-mcc版本已经为2.0,而MIDEVA最新版本为4.5。 将matlab与C混合编程大概有如下三种方法 。1.用Matlab的mcc将.m文件翻译为cpp源文件,然后在C编译器中调用

3、也可以用mcc编译编译为stand-alone程序。 2.用Matcom(MIDEVA)将.m文件翻译为cpp代码,并编译为exe或dll 文件。 3.按照matcom的语法,在VC或BC中直接书写matlab语句(与matlab 很相似),这也是推荐用的方法。 方法1、2和3各有利弊。1不支持图形(支持图形的库国内现在还没有D),对类支持也不够。2支持绝大多数的matlab语句(包括图形),但对于struct等的支持也有缺陷。 VC+中使用MATLAB的C+数学库和MCC生成的程序。MATLAB5.3的提供了C/C+数学库,其中的C+数学库功能很强,使用它可以用类似MATLAB的语法编写C+

4、程序,十分方便。虽然速度上仍然比手工C/C+程序慢,但是由此换来的高效的开发效率和可靠性往往是值得的。另外mcc命令可以将M文件转化为C或CPP文件,编译后可以脱离MATLAB运行,它们也是使用的C/C+数学库。 MATLAB的数学库在开发时似乎倾向于编译独立的可执行程序,把VC、BC只是作为一个编译和连接的工具,而没有过多地考虑在VC、BC的集成环境下进行开发。如何将MCC生成的C+程序嵌入到VC?这里只介绍VC的情况。1、设置项目编译选项 首先建立一个新的项目,或者打开一个已有的项目,然后选择菜单: Project-Settings-C/C+ Category:Preprocessor P

5、reprocessor definitions: 添加: MSVC,IBMPC,MSWIND Category: Precompiled Headers 选择: Automatic use of precompiled headers Through header: stdafx.h 2、调设置项目连接选项 首先要从下面几个函数定义文件(*.def)生成相应的导入库文件(*.lib) libmmfile.def libmcc.def libmatlb.def libmx.def libmat.def 它们位于目录c:matlabexterninclude 用下面命令导出库文件: lib/def

6、:libmmfile.def/out:libmmfile.lib /machine:ix86 lib /def:libmcc.def /out:libmcc.lib /machine:ix86 lib/def:libmatlb.def/out:libmatlb.lib /machine:ix86 lib /def:libmx.def /out:libmx.lib /machine:ix86 lib /def:libmat.def /out:libmat.lib /machine:ix86 将它们放入的项目连接选项 Project-Settings-Link Category:Input Obj

7、ect/library modules: 添加:libmatpm.lib libmmfile.lib libmcc.lib libmatlb.lib libmx.lib libmat.lib 注: 中间是空格,不要加逗号. libmatpm.lib是C+ MathLib的库,如果是只用C,就不用连接它了。 添加: msvcrt.lib 以上的这些lib文件,打了个包放在这里下载:matlablibs.zip (64K) 3、设置编译环境Tools-Options-Directories Include fiels添加: c:matlabexterninclude c:matlabexterni

8、ncludecpp Library fiels添加: c:matlabexternlib c:matlabexterninclude 注:下面这个目录是那些lib所在的地方。 如果都挪到上面的目录,这个自然就不要了。 4、编写程序用MCC命令生成的CPP文件和自己手工编写的CPP文件, 其项目设置是完全相同的, MCC生成的CPP文件有大量没用的代码. (1)添加自己编写的程序模块 用下面文件头: #include stdafx.h, #include matlab.hpp 然后, 按照C+ MathLib文档要求的格式书写程序. 最后,按F7编译就可以了。 (2)嵌入mcc生成的文件 在MA

9、TLAB下用下面格式的命令生成cpp文件 mcc -t -L Cpp test 得到test.hpp, test.cpp 将test.cpp加入项目, 不做任何改动. 5、实例MATLAB程序test.m: function sum, prod=test(x,y) sum = x+y; prod = x*y; 用来计算两个数的和与积。注意这是两个返回变量的情况。 x,y可以是数组。 用mcc命令生成了test.hpp和test.cpp。文件demo.cpp: #include stdafx.h #include matlab.hpp #include test.hpp void mccDemo

10、() CString str; mwArray x, y, sum, prod; double dx,dy,dsum,dprod; x = 5.0; y = 10.0; sum = test(&prod, x, y); dx=x(1,1); dy=y(1,1); dsum=sum(1,1); dprod=prod(1,1); str.Format(%f+%f=%fn%f*%f=%f, dx,dy,dsum,dx,dy,dprod); AfxMessageBox(str); 由于采用了C+数学库,语法很简单。注意数组的赋值、其中数据的存取,这些都要仔细地看手册。 最后是跳出一个消息框,显示计算结

11、果。 改程序启动之后,选择菜单mcc-demo即可。 第二节 用C编写mex程序 Matlab是一种解释型的编程环境,跟basic一样,是读句执行的。可以实现编程过程中的交互,免去了麻烦又耗时的编译过程。但matlab在执行时速度慢也就根源于此。在matlab里 tic for i=1:10000 b(i)=a(10001-i); end 怎么样,是不是很慢? 上面程序的功能是将向量a里的数据逆序赋给向量b。下面的程序可以实现相同的功能 tic b=a(10000:-1:1); 为什么这个程序运行速度这么快呢? 这是因为matlab里的基础矩阵运算函数,像转置,复制等等,都是以二进制程序的形式

12、存在的,运行起来速度当然比解释执行10000次 所以编matlab程序时,应该尽量避免用循环语句,而使用等效的矩阵运算。虽然这样 但总是有的时候没法找到对应的矩阵运算来等效,或编出来的程序复杂得让人无法优化。 简单地说,mex程序就是根据一定的接口规范(mtlab提出的)编写的一个dll的matlab程序。比如编了一个mex函数,名字叫max2.dll,那么只要把这个dll所在的目录加到matlab的搜索路径里(用addpath),就可以像调用普通matlab函数一样来调用它了。因为把循环体放到了二进制程序中,执行速度快得多。 Mex文件既可以用c,也可以用fortran来编。因为本节用的是c

13、语言,所以下面的介绍都是用c语言编写mex文件的方法。如果用的是fortran,请参阅Apiguide.pdf里面有关详细说明。 2.1 用C编写mex程序 的性能分析 Matlab5.1没有c语言的编译器的,机器要安装有VC,BC或Watcom C中的一种。如果在安装Matlab时已经设置过编译器,就可以使用mex命令来编译c语言的程序了。如果当时没有选,只要在Matlab里键入:mex -setup,就会出现一个DOS方式窗口,下面只要根据提示一步步设置就可以了。测试设置路径hello.c。 #include mex.h void mexFunction(int nlhs, mxArray

14、 *plhs, int nrhs, const mxArray *prhs) mexPrintf(hello,world!n); 假设把hello.c放在了C:TEST下,在Matlab里用CD C:TEST 将当前目录改为C: TEST(注意,仅将C:TEST加入搜索路径是没有用的)。输入: mex hello.c 编译应该在出现编译器提示信息后正常退出。如果已将C:TEST加入了搜索路径,现在键入hello,程序会在屏幕上打出一行:hello,world! 看看CTEST目录下,会发现多了一个文件:HELLO.DLL。 这样,第一个mex函数就算完成了。怎么样,很简单吧。下一次,会对这个最

15、简单的程 进行分析,并给它增加一些功能。 Matlab的mex函数有一定的接口规范nlhs:输出参数数目 plhs:指向输出参数的指针 nrhs:输入参数数目 例如,使用 a,b=test(c,d,e) 调用mex函数test时,传给test的这四个参数分别是2,plhs,3,prhs。其中: prhs0=c , prhs1=d , prhs2=e ,prhs2=e 直观地了解参数传递的过程 /hello.c 2.0 #include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) i

16、nt i; i=mxGetScalar(prhs0); if(i=1) mexPrintf(hello,world!n); else mexPrintf(大家好!n); 将这个程序编译通过后,执行hello(1),屏幕上会打出: hello,world! 而hello(0)将会得到: 大家好!程序hello已经可以根据输入参数来给出相应的屏幕输出。用到了屏幕输出函数mexPrintf(用法跟c里的printf函数几乎完全一样)。用到了函数:mxGetScalar,调用方式如下: i=mxGetScalar(prhs0); 第三节 内存分配与地址空间分配 输入数据是在函数调用之前, 在Matla

17、b里申请了内存。由于mex函数与Matlab共用同一个地址空间,因而在prhs里传递指针就可以达到参数传递的目的。但是,输出参数却需要在mex函数内申请到内存空间,才能将指针放在plhs中传递出去。由于返回指针类型必须是mxArray,所以Matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内存的申请 mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag) m:待申请矩阵的行数 n:待申请矩阵的列数 为矩阵申请内存后,得到的是mxArray类型的指针,就可以放在plhs里传递回去了。对

18、这个新矩阵的处理,要在函数内完成,这时就需要用到前面介绍的mxGetPr。使用mxGetPr获得指向这个矩阵中数据区的指针(double类型)后,就可以对这个矩阵进行各种操作和运算了。 一个例子/reverse.c 1.0 #include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) double *inData; double *outData; int M,N; int i,j; inData=mxGetPr(prhs0); M=mxGetM(prhs0); N=mxGetN(

19、prhs0); plhs0=mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr(plhs0); for(i=0;iM;i+) for(j=0;jN;j+) xREAL; outData=mxGetPr(plhs0); for(i=0;iM;i+) for(j=0;jN;j+) outDataj*M+i=inData(N-1-j)*M+i; 综合例程#include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) double *inDat

20、a; mxArray *IN1; mxArray *OUT1; double *outData; int M,N; int i,j; /异常处理 if(nrhs!=1) mexErrMsgTxt(USAGE: b=rot(a)n); if(!mxIsDouble(prhs0) mexErrMsgTxt(the Input Matrix must be double!n); /计算转置 if(mexCallMATLAB(1,OUT,1,prhs,) mexErrMsgTxt(Error when compute!n); /根据输入参数数目决定是否显示 if(nlhs=0) mexCallMATL

21、AB(0,IN,1,OUT,disp); else plhs0=OUT0; 第四节 Matcom的使用 Matcom能作什么? 1)它提供了matlab中.m文件与其他高级语言的接口,使.m文件可以编译为脱离matlab环境独立执行的可执行性程序, 具有以下特点: 。提高了代码的复用率 。提高了代码的执行速度 。使纯文本的.m文件变为二进制的可执行程 序,增加了知识保护的安全性。 2) 它提供了近千个数学函数,提供了一个丰富的数学库,基本上在matlab上能用的常用函数都可以在高级语言中直接调用。 。矩阵属性函数 ,矩阵生成函数, 矩阵生成函数, 矩阵操作函数, 矩阵变换函数, 数学函数, 特殊函数 ,数值函数 ,串函数 ,绘图函数 ,颜色函数 , 。函数, 存盘及读文件, 系统资源函数, 系统操作函数,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论