2022年MATLAB与C语言对接 .pdf
《2022年MATLAB与C语言对接 .pdf》由会员分享,可在线阅读,更多相关《2022年MATLAB与C语言对接 .pdf(30页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、|首页|站长简介|讲座连载|应用文摘|应用程序介绍|友情链接|MATLAB论坛|主站多来米镜像站亿唐镜像站网站英文版站长简介学术论文著作与讲义MATLAB软件MATLAB语言MATLAB绘图现代科学运算反馈系统分析控制系统CAD图形界面设计外部程序接口MATLAB接口常问问题解答MATLAB算法MATLAB与 C 接口MATLAB+ActiveXMATLAB文摘(一)MATLAB 6 PDFPS和 PDFMATCOM名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 30 页 -MATLAB 1.0SciLab数学程序包LaTeX 资源免费工具箱CTeXCAE2000 专版MATLA
2、B&VC哈工大MATLAB教学相关站点综述MATLAB讨论区薛杨的动物园精品软件资讯网CHICAGO 神经网络邮件列表MATLAB论坛文摘目录o 站长的话o MATLAB与 C 语言的接口o C+Builder 调用 Matlab 的实现方法o VC+下如何利用Matlab 工具箱进行数字信号处理o 通过VC+实现对 MATLAB 的调用o Matcom:Matlab 与C+结合的MATLAB 与 C 的接口(文章选登)站长的话为交流MATLAB 语言和其他语言的接口,在本部分填加了一些这样的文章,放在这里的目的纯属交流之用,除本站站长自己发表的文章外,并不代表网站的观点。如果有作者认为其文章
3、放在这里“侵权”,请 与站长联系,将立即撤去。谢谢合作。站长将自己的一篇见解先放在前面,给想用混合编程的朋友“泼点冷水”。欢迎大家商榷,并将自己的经验和观点寄给站长,以便适当的时间增加网友的评述,大家共享。征文征求有关MATLAB 语言的文章供访问者参考和共享。可以是个人的心得体会,一点经验,也可以是翻译的文章资料。请和站长联系。站长也将会不定期地将自己的资料上传到网站。MATLAB 与 C 语言的接口东北大学薛定宇(原作)转载时请注明作者信息、网址,谢谢MATLAB 到 C 语言程序的转换可以由两种途径完成,其一是MATLAB 自己提供的C 语言翻译程序mcc,另一种是原第3 方公司Math
4、Tools 开发的MATCOM。后者出现较早,功名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 30 页 -有效途径o Matlab 和C+接口中函数注册的实现o Matlab 与C+混合编程o VC+中编译 MEX 程序o C+Builder与 Matlab 混合编程的实现o VC+调用MATLAB Engine能远比MATLAB 自己的翻译程序强大,所以MathTools 公司已经被MathWorks 公司收购,并已将其开发技术融于新推出的MATLAB 6.0(Release 12)中。依本人的观点,二者都不完善,有大量的MATLAB 函数及数据类型是不能兼容变换的,所以有时
5、会发现将简洁的MATLAB 程序翻译成C 语言程序很晦涩。翻译后的C 程序几乎不适合手动去维护,更谈不上升级了。有几个不兼容的地方是不能令人容忍的,例如eval()函数在C 翻译下是不兼容的,最新的MATLAB 6 才刚刚敢说已经部分兼容了,但离真正的兼容还有很长的路要走,有很多艰难的技术困难需要克服,短时间内不可能有突破性的进展。另一个大的问题是,众所周知,MATLAB 新的控制系统工具箱中定义了大量的LTI 类,MATLAB 5 开始也允许使用类与对象的概念,这已经向“面向对象”的编程走了一大步,但 MATLAB 到 C 的翻译明显都不支持“对象”的数据类型,所以在控制系统分析与设计(当然
6、还有其他的领域)中这样的转换几乎没有什么实际意义,所以不要将这样的转换太理想化。从转换的程序速度来看,因为mcc 和 MATCOM 都沿用了MATLAB 的程序运算机制,所以不可能大幅度地提高程序运行速度。相反地,如果将MATLAB 程序中明显的瓶颈部分用C 语言按照MEX 格式编写,则可以大大加快速度。作者在科学运算语言MATLAB 5.3 程序设计及应用一书中以例子做过探讨,MCC 可以比快50%,而 MEX 的形式可能快上百倍。举例分形问题:从初始点(x0,y0)出发,按下面的公式生成新的点(x1,y1)其中i 为(0,1)区间均匀分布的随机数。要求从(x1,y1)再生成(x2,y2),
7、.,直至生成1,000,000 个点(有点夸张,但太少了用MATLAB 测时间不准)。可以下载用MATLAB 的 M-函数写的程序、用Mex_C 写的程序。程序调用语句为:N=1000000;v=rand(N,1);tic;x,y=frac_tree(0,0,v,N);toc 然后测试一下速度,再想法用MATCOM 或 MCC 转换一下,再试试速度。问题:MATCOM 程序到底比M 函数快多少?我用Mex_C 实现的速度可是快100 多倍啊!下面有文章介绍,用 MATCOM VC 能平均快 1.5 倍(在别的应用上),依作者的观点,为了这区区1.5 倍还不至于自己给自己找麻烦去用MATCOM。
8、这样看,可能MATLAB 到 C 转换唯一的好处就是它能开发具有自主版权的软件了。所以本人一般不太赞同用这样的转换方法去开发程序,尤其不赞成刻意追求MATLAB+C 的方式。本人认为:除非必要,一般别采用这样的方法。提出这样的观点,欢迎商榷。MATCOM 目前有BC 和 VC 两个程序,MATLAB VC 之家中收录了一些文章。作者见到有下载区有这样的软件。?在这里给出一个下载区的链接名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 30 页 -C+Builder 调用 Matlab 的实现方法国防科技大学机电工程与仪器系张云洲摘要:本文简要叙述了Matlab 语言的优点,介绍了在
9、用Borland C+Builder语言开发的 Windows应用程序中,调用matlab 语言实现科学计算和图形绘制的方法。关键词:C+Builder Matlab 调用混合编程1.引言Matlab 是一个高度集成的系统,集科学计算、图象处理、声音处理于一体,具有极高的编程效率。近年来,Matlab 已经从最初的“矩阵实验室”,渗透到科学与工程计算的多个领域,在自动控制、信号处理、神经网络、模糊逻辑、小波分析等多个方向,都有着广泛的应用。Borland C+Builder 是一种新颖的可视化编程语言。在工程应用中,我们一般用C+Builder语言编写应用程序,实现交互界面、数据采集和端口操作
10、等,但C+Builder 在数值处理分析和算法工具等方面,其效率远远低于Matlab 语言。在准确方便地绘制数据图形方面,Matlab 语言更具有无可比拟的优势。此外,Matlab 还提供功能强大的工具箱。但Matlab 的缺点是不能实现端口操作和实时控制。因此,若能将两者结合运用,实现优势互补,将获得极大的效益。本文结合实际介绍了应用Borland C+Builder3.0开发的 Windos 应用程序中,对 Matlab 的调用方法。2.C+Builder 调用 Matlab 的实现方案2.1 实现思路在高版本的Maltab 中(如 Matlab V4.2)提供了 DDE 接口,用户可以通
11、过Windows 的 DDE通讯基制实现外部调用。这种实现方式比较简单,但将增大主程序代码,影响运行速度。在 Windows 系统中,DLL 是一种很特别的可执行文件,可以被多个Windows 应用程序同时访问,具有固定的共享数据段。该数据段的数据在DLL 被 Windows 下载前会一直保留在内存中,因此可以通过DLL 实现用户程序与Matlab 之间的数据传输和函数调用。具体地说,就是利用Matlab 的 32 位动态连接库(DLL),生成相应的可以被C+Builder 调用的 DLL,用来提供二者之间的基本支撑环境。只需在用户程序中加载该DLL,即可实现其数据段的共享。然后在用户程序中操
12、作DLL 数据段的数据,并通过某种方式在用户程序中使Matlab执行该 DLL,就可实现用户程序对Matlab 的调用。其形式可以是混合编程或函数调用,非常方便而高效。2.2 实现方式名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 30 页 -Matlab 提供了可外部连接的DLL 文件,通过将其转换为相应的Lib 文件,并加以必要的设置,就可以在 C+Builder 中直接进行 Matlab 函数调用,实现 C+Builder 语言与 Matlab 语言的混合编程。2.2.1 运行环境要求由于 Matlab 提供的是 32 位的 DLL。其运行环境要求是Matlab V4.2
13、或更高版本。C+Builder可以进行 32 位编程,这里我们采用的是V3.0 版本。2.2.2 C+Builder 下 LIB 文件的生成Matlab 提供的 Def 文件允许用户通过Implib 命令生成相应的Lib 文件。其命令格式为:Implib?.lib?.def 在externinclude 目录下,提供了如下三个.Def 文件:_libeng.def,_libmat.def,_libmx.def 通过上述命令可以生成相应的三个Lib 文件。这些Lib 文件中包含了可外部调用的Matlab 函数的必要信息。3.C+Builder 调用 Matlab 实现计算和绘图为清楚起见,作者通
14、过一个简单的CBuilder 例程进行说明。该实例通过调用Matlab 实现矩阵运算并绘制图形,来演示C+Builder 对 Matlab 的调用。在C+Builder 编辑环境中,建立一个新的窗体 MyForm,并放置一个按钮Demo。将工程文件命名为Try.prj,其主函数为try.cpp。在主函数中,我们将使用一个实现Matlab 调用的子函数DemoMatlab,作为按钮Demo 的响应事件。其源代码如下:#include#pragma hdrstop#include Unit1.h#pragma package(smart_init)#pragma resource*.dfm TMy
15、Form*MyForm;_fastcall TMyForm:TMyForm(TComponent*Owner):TForm(Owner)void _fastcall TMyForm:DemoClick(TObject*Sender)名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 30 页 -DemoMatlab();/演示 Matlab 语言调用-为了调用 Matlab 中的函数,必须进行必要的设置,将包含这些函数的文件加入工程文件Try.prj。以下是操作过程:a 在头文件中加入Engine.h。其包含了启动Matlab 调用和关闭的函数声明。b 打开 Project|Opti
16、on对话框,点击Directories/Conditionals 在 Include Path 中,加入目录路径externinclude,该路径包含了engine.h和 matlab.h等有用的头文件。在 Library Path 中,加入 bin 和externinclude。这两个目录路径包含了可外部调用的 DLL 和 LIB 文件。c.点选 Project|Add to Project对话框,加入如下库文件:_libeng.lib,_libmat.lib 和_libmx.lib。在进行了这些必要的设置之后,我们就可以选用适当的函数来实现目标。以下是子函数DemoMatlab 的程序代码
17、。void DemoMatlab Engine*eng;/定义 Matlab 引擎char buffer200;/定义数据缓冲区int array6=1,2,3,4,5,6;mxArray*S=NULL,*T=NULL;engOpen(NULL);/打开 MATLAB 引擎-S=mxCreateDoubleMatrix(1,6,mxREAL);/产生矩阵变量mxSetName(S,S);memcpy(char*)mxGetPr(S),(char*)array,6*sizeof(int);engPutArray(eng,S);/将变量 X 置入 Matlab 的工作空间engEvalString
18、(eng,T=S/S.2;);/计算engEvalString(eng,plot(S,T););/绘制图形 engOutputBuffer(eng,buffer,200);/获取 Matlab 输出T=engGetArray(eng,T);名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 30 页 -/获得计算结果-engClose(eng);/关闭 Matlab 引擎,结束调用mxDestroyArray(S);/释放变量mxDestroyArray(T);若还需要执行其它功能和任务,那么按照上面介绍的方法,进行变量声明后,在、处加写需要的语句既可。当然,使用这种方法调用Matl
19、ab 不能脱离 Matlab 环境的支撑。但当我们不需要看到Matlab的命令窗口时,可将其赋予Swhide 属性而加以隐藏。4.结语按照本文介绍的方法来实现C+Builder 下应用程序对Matlab 的调用,可以充分利用Matlab强大的科学计算功能和丰富的工具箱,而且具有混合编程、方便高效的优点。这是C+语言和其它高级语言所无法比拟的。按照本文的方法,我们还可以编写程序来最充分地利用Matlab 的其它资源,开发满足自己需要的程序,更有效地完成我们的工作。VC+下如何利用 Matlab 工具箱进行数字信号处理潘 卫 明 赵 敏 张 进 芳(南京航空航天大学测试工程系210016)摘要:本
20、文详述了在Vc 环境下如何利用Matlab 工具箱进行数字信号处理,全文以Matlab 工具箱中功率谱密度分析函数为例,介绍了通过Matlab 自带的引擎、Matlab 自身的编译器以及利用MathTools 公司的 Matcom 进行对工具箱函数的调用。关键词:Matlab M-文件引擎 编译器Matcom Vc+Matlab 的信号处理工具箱是信号算法文件的集合,它处理的基本对象是信号与系统,信号处理工具箱位于目录、ToolboxSignal 下,利用工具箱中的文件可以实现信号的变换、滤波、谱估计、滤波器设计等。在其它的环境如Vc 下如果能调用Matlab 工具箱中的文件,会大大地加快一些
21、算法的实现,同时其可靠性也很高。1.利用 Matlab 引擎Matlab 引擎采用客户和服务器计算方式,在运用中,Vc 的 C 语言或 C+语言的程序作为前端客户机,它向 Matlab 引擎传递命令和数据信息,并从 Matlab 引擎接收数据信息,它提供了下列几个函数:engOpen,engGetArray,engPutArray,engEvaString,名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 30 页 -engOutputBuffer,engClose 与客户机进行交互。下面例程是在Vc 下建一个基于对话框的应用程序,在对话框中设置一个Button 控件OnMatla
22、bEngine.,在对话框.cpp 文件中加入”engine.h”和“math.h”头文件,下面给出部分程序清单。Void CtestmatlabDlg:OnMatlabEngine()Engine*ep;mxArray*T=NULL,*result=NULL,*mFs=NULL,*mnfft=NULL;double datax1024;char buffer1024;for(int j=0;j1024;j+)/注:如通过采集卡采集数据可将采集的数据放在datax数组中,此循环就不需要 double samt=(double)(1.0/1024);dataxj=sin(2.0*63.0*sam
23、t*3.1415926+1.15*3.1415926);double*pPxx,*pFxx;if(!(ep=engOpen(0)/打开 Matlab 引擎,建立与本地Matlab 的连接fprintf(stderr,n Cant start MATLAB enginen);exit(-1);double Fs1=1024;/因为 Matlab 所有参与运算的参数都是矩阵的形式,因而下列几行将参数转变double nfft1=1024;/成 Matlab 可接受的矩阵形式。T=mxCreateDoubleMatrix(1,1024,mxREAL);mnfft=mxCreateDoubleMatr
24、ix(1,1,mxREAL);mFs=mxCreateDoubleMatrix(1,1,mxREAL);mxSetName(T,T);mxSetName(mnfft,mnfft);mxSetName(mFs,mFs);memcpy(char*)mxGetPr(T),(char*)datax,1024*sizeof(double);memcpy(char*)mxGetPr(mnfft),(char*)nfft,sizeof(double);memcpy(char*)mxGetPr(mFs),(char*)Fs,1*sizeof(double);engPutArray(ep,T);/将转化的参数放
25、入引擎中,此时可在Matlab command 窗口下查看此参数engPutArray(ep,mnfft);engPutArray(ep,mFs);engEvalString(ep,pxx,fo=psd(T,mnfft,mFs););/利用引擎执行工具箱中文件engOutputBuffer(ep,buffer,512);/如只想看显示图形,可将返回参数去掉,psd 无返回参数缺省情况下会自动画图形result=engGetArray(ep,pxx);/取出引擎中的数据放在所指的区域中供后续处理pPxx=mxGetPr(result);result=engGetArray(ep,fo);名师资料
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年MATLAB与C语言对接 2022 MATLAB 语言 对接
限制150内