教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 学前教育 >

Matlab和C混合编程的几种方法比较(5)

来源:网络收集 时间:2026-08-23
导读: 2.4 DLL 实例 2.4.1 引言 DLL是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供多个应用程 序调用,而不是每个应用程序在连接时都要增加一个库中目标代码的拷贝。可以整体减少文件外部存储空间的占有量

2.4 DLL 实例

2.4.1 引言

DLL是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供多个应用程

序调用,而不是每个应用程序在连接时都要增加一个库中目标代码的拷贝。可以整体减少文件外部存储空间的占有量,并实现了代码共享。

(l)根据实际问题的需要,在MATLAB中开发算法。MATLAB的开发环境功能强大,其语言简单直观。而且为用户提供了完善的代码调试工具,用户可以在函数执行的任何时候知道当前局部变量和全局变量的数值。另外,当前用户完成算法的调试工作后,往往希望了解该算法中哪几条语句最消耗计-算时间,MATLAB提供Profiler工具可以很好地解决这一问题。借助于Profiler的强大功能,用户可以完全掌握调用关系比较复杂的程序的执行情况,每一个函数的被调用次数和执行时间都可以清楚地显示出来。用户可以借助编译工具或优化代码工具对算法的瓶颈部分进行处理,尽可能地优化算法,或者将耗时的代码用C实现。这种方法就是前面介绍的MEX方法。

(2)利用Matlab Compiler和VC编译m文件,将开发好的算法转换为C或C++代码,然后生成动态链接库,将算法封装其中。在VC的IDE中开发应用程序的图形用户界面,通过DLL调用已开发好的算法。采取的调用方法一般是通过DLL的头文件获取DLL的功能和函数调用方式,然后在VC中当成普通的C函数调用。这是将要介绍的DLL方法。 2.4.2 原理

DLL方法和前面介绍的Add-in方法大同小异,也是用VC编译器将m文件转化为可以被VC中介编译调用的语言,两者都产生相应的.h文件和.c文件,只是DLL方法的中功能函数有DLL实现,而Add-in方法直接用C/C++代码实现。由以上的介绍,就可以很明白DLL方法需要的为:功能函数的.h文件、.lib文件、.dll文件。下图是Matlab compiler user’s guide中关于独立可执行程序生成的过程,生成DLL的过程也大体相似。Matlab7.0自带的Compiler 4.0比以前的编译器有较大的变化,具体变化不详……

2.4.3 实现过程

以低通滤波器设计为例。M 文件myfilter.m 源代码如下:

function [b, a] = myfilter(wp,ws) [n, wn] = buttord(wp, ws, 3, 30); [b, a] = butter(n, wn);

具体步骤为:

1. 在VC中建立基于对话框的工程test3,包含wp、ws两个输入编辑框和一个测试

按钮;

2. 在matlab命令行中键入mcc -t -W lib: filterlib -T link:lib myfilter,生成一大堆文

件,我们用到的有三个文件:filterlib.h、filterlib.lib、filterlib.dll,将这三个文件Copy到test3目录下;

3. 在VC中作如下设置:(a)Project->Settings->link->Objects/Library Modules中添

加一些库文件名filterlib.lib libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmex.lib libut.lib libmatpm.lib,每个库干什么用我不是很清楚,参考文件中有说明;(b)设置VC的搜索路径,具体操作为在Tools->Options->Directories的inlcude搜索路径中添加\\extern\\include。因为用到了VC的编译器,所以在lib搜索路径中还要加入\\extern\\lib\\win32\\microsoft\\msvc60;

4. 在测试按钮对应的函数中添加Matlab的Math C语句和具体的滤波器设计语句:

double a; double b; double result;

UpdateData(true); a = m_Editwp; b = m_Editws;

mxArray *A = mclGetUninitializedArray(); mxArray *B = mclGetUninitializedArray(); mxArray *C = mclGetUninitializedArray();

filterlibInitialize(); // 请注意:不是InitializeModule_filterlib(); mlfAssign(&A,mlfDoubleMatrix(1,1,&a,NULL)); mlfAssign(&B,mlfDoubleMatrix(1,1,&b,NULL)); C = mlfMyfilter(NULL, A, B); filterlibTerminate();

double *md = mxGetPr(C); result = md[0];

此时,最终的结果就保存在指针result中。具体怎么取出来并不是难事,这里不作研究。 2.4.4 总结

DLL方法和Add-in方法相似,从实现过程也可以看出来。之所以单独提出来,是因为这种做法具有一定的代表性,调用库来实现算法,看起来都气派!

以上是几种方法,还有其他的,尤其是7.0后的版本,我没有研究过。就以上的方法来

讲,我首推Matcom 的方法,其次是Add-in。

第三部分 参考文献

1. 2. 3. 4. VC与Matlab结合方法的分析 姚鑫浩

基于Matlab Add-in的Matlab/VC混合编程的研究 李霞 李萌彦

运用mex文件优化Matlab软件性能 谢莉萍 龙志强 谢海斌 VC与MATLAB混合编程之DLL实现方法 肖永韧 解习农 刘晓峰 5. 6.

…… 此处隐藏:540字,全部文档内容请下载后查看。喜欢就下载吧 ……
Matlab和C混合编程的几种方法比较(5).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/595550.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)