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

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

来源:网络收集 时间:2026-08-23
导读: 但是VC的编译器不能编译Matlab的内建函数的硬伤使得对很多算法的编译不能得心应手,比如该编译器对FFT就无能为力。 滤波器设计是信号处理、自动控制等领域不可回避的问题,用VC等工具实现滤波器的设计相当繁琐,Mat

但是VC的编译器不能编译Matlab的内建函数的硬伤使得对很多算法的编译不能得心应手,比如该编译器对FFT就无能为力。

滤波器设计是信号处理、自动控制等领域不可回避的问题,用VC等工具实现滤波器的设计相当繁琐,Matlab在这些方面又得天独厚的优势,所以可以考虑在VC中调用Matlab的滤波器设计工具箱,在VC中直接实现滤波器的设计。 2.2.2 原理

Add-in的原理是将M文件转化为C++文件,经过适当的Matlab的Math C函数连接整合,在VC中调用。 2.2.3 实现过程

VC中Add-in的设置步骤:

(1)在Matlab命令行中键入mex –setup(注意“mex”与“-”之间有空格)和mbuild -setup命令,按照给出的提示选择MSVC6.0作为编译器。配置好后,Matlab将提示Add-in组件已成功安装到VC。此时别忘了在Matlab命令行中继续键入cd(prefdir)和mccsavepath命令,将Matlab的路径写入VC中的某些文件。

(2)在VC菜单中选择Tools->Customize->Add-ins and Macro Files一栏,勾选MATLAB Add-in,然后关闭,此时下图所示的Matlab add-in的工具条Toolbar1就会出现。

(3) 接下来是在VC的include设置搜索路径。在Tools->Options->Directories的include搜索路径中添加\\extern\\include;因为用到了VC的编译器,所以在lib搜索路径中还要加入\\extern\\lib\\win32\\microsoft\\msvc60。

前期准备到这里就完成了,配置一次,终身管用。下面用Add-in方法,调用Matlab的滤波器设计工具箱,做一个简单的低通滤波器设计。具体步骤如下:

首先建立一个基于对话框的exe工程取名test2,修改对话框的界面如图:

N为滤波器的阶数,WN是归一化带宽,产生的滤波器系数在Filter coefficients编辑框内显示出来。

第二步是点击Toolbar1内的.m++,选择添加myfilter.m文件,源代码如下: function [b, a] = myfilter(n,wn) [b, a] = butter(n, wn);

此时出现下图所示的对话框,选择默认,按OK后,自动生成一大堆的m文件和C源和.h文件,有用的是myfilter.c和myfilter.h。前者是myfilter.m转化而来的C文件,不过太繁琐,只要看后者就可以知道他的功能和调用方法了。

myfilter.h文件里有这几行语句:

extern void InitializeModule_myfilter(void); extern void TerminateModule_myfilter(void);

extern _mexLocalFunctionTable _local_function_table_myfilter;

extern mxArray * mlfMyfilter(mxArray * * a, mxArray * n, mxArray * wn); extern void mlxMyfilter(int nlhs, mxArray * plhs[], int nrhs, mxArray * prhs[]);

其中extern void InitializeModule_myfilter(void);和extern void TerminateModule_myfilter(void);明显是初始化语句,extern mxArray * mlfMyfilter(mxArray * * a, mxArray * n, mxArray * wn);为调用形式,具体实现在myfilter.h文件中,能把人看晕。

第三步为Test按钮的响应函数void CTest2Dlg::OnButtonTest()添加代码: double nOrder; // ??2¨?÷?×êy double nWn; // ??2¨?÷???1?μ?ê(0~1) double *pNum = NULL; // ó?à′·μ????2¨?÷?μêy

mxArray *mxArray_nOrder; // mxArray ààDíμ???2¨?÷?×êy mxArray *mxArray_nWn; // mxArray ààDíμ???2¨?÷???1?μ?ê mxArray *mxArray_num; // mxArray ààDíμ???2¨?÷?μêy

UpdateData(true);

nOrder = double(m_EditN); nWn = m_EditWN;

mxArray_nOrder = mxCreateDoubleScalar(nOrder); // mxArray_nOrder3?ê??ˉ mxArray_nWn = mxCreateDoubleScalar(nWn); // mxArray_nWn3?ê??ˉ

InitializeModule_myfilter(); // μ÷ó?3?ê??ˉ

mxArray_num = mlfMyfilter(NULL, mxArray_nOrder, mxArray_nWn); // oˉêyμ÷ó?

pNum = mxGetPr(mxArray_num); // double ààDíμ???2¨?÷?μêy

TerminateModule_myfilter(); // μ÷ó?mlfMyfilteríê±? mxDestroyArray(mxArray_nOrder); mxDestroyArray(mxArray_nWn); mxDestroyArray(mxArray_num);

mxCreateDoubleScalar、mxGetPr、mxDestroyArray等函数功能可以在Matlab的帮助了找到。代码层次分明:mxArray_nWn = mxCreateDoubleScalar(nWn); 之前的语句用来实现参数的输入;mxArray_num = mlfMyfilter(NULL, mxArray_nOrder, mxArray_nWn)完成滤波器的设计;pNum = mxGetPr(mxArray_num);接收滤波器的系数,最终的滤波器系数保存在指针pNum中,能在VC中使用。至于在实际应用中具体怎么操作,已不在讨论范围之内了。 2.2.4 总结

1. 可以边修改m文件边调试;

2. 点击Toolbar1上的包裹状按钮还可以实现程序的打包,将用到的一些库文件发布成一个压缩文件,在没有安装Matlab的机子上,解压缩,程序照样可以运行,这一点很有诱惑力;

3. 不能编译Matlab的内建函数,图形句柄不能用(不知道是我没调通还是真的不能用)。 总体来讲,这种方法还是值得推荐的。

2.3 Matcom 实例

2.3.1 引言

Matcom的特点:Matcom是一个非常有用的m文件编译器 (compiler),它有如下几大优点:

1.它提供了Matlab语言中m文件和其他语言的接口,使m文件可以编译为脱离Matlab环境独立执行的可执行程序,这样不仅提高了代码的复用率,执行速度快,而且使纯文本的。m文件转化为二进制的可执行文件,增加了知识保护的安全性。

2.它提供了近千个数学函数。对于其他高级语言编辑器来说,提供了一个丰富的数学库,基本上在Matlab上能用的常用函数都可以在高级语言中调用,数学函数主要包括矩阵属性生成函数、数学函数、绘图函数等。

3.它可以编译Matlab的大部分函数,包括fft等,但是不知道为什么,不能编译xcorr这样的函数,有可能是Matlab5.3时候的相关函数不是xcorr(待考证)。 2.3.2 原理

Matcom的工作原理:Matcom的矩阵运算部分是基于一个名为Matrix的C++数学库,这个库提供了绝大多数的关于矩阵类、矩阵操作函数、数值计算函数、数学函数等的定义,在Matcom中是以lib目录下的*.lib以及windows/system/ 对应名称的dll文件提供的。

Matcom的另一大部分就是图形部分,它是用一种非常流行的绘图OCX控件TeeChart3.0来实现的,这种控件对于一般的绘图功能都可以实现,但也存在一定缺陷。在Matcom4.5版本中使用的是TeeChart3.0。绘图函数功能主要在lib文件和 window/system/ago*.dll中定义的。

Matcom编译m文件时先将m文件按照与Matcom的cpp库的对应关系,翻译为cpp源代码,然后用对应版本的C编译器将该CPP文件编译为.exe或.dll文件,所以,在第一次运行时让指定C Compiler的路径是必要的,否则将无法编译。指定好的C Compiler的信息写在Matcom/bin/matcom.ini文件中,这些都是在安装的时候自动完成的。

2.3.3 实现过程

按下列步骤完成Matcom add-in的安装:

1.安装Matcom,按提示选择Visual C++的安装路径;

2.运行Visual C++,从菜单条中选择Tools/Customize/Add-ins and Macro Files,选择Browse,改变文件类型为Add-ins(.dll),选定D:\\Matcom45\\bin\\mvcide.dll文件,确定;

3.此时,可以在VisualC+十的开发环境 …… 此处隐藏:3753字,全部文档内容请下载后查看。喜欢就下载吧 ……

Matlab和C混合编程的几种方法比较(3).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)