版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、科 学 技 术 与 工 程6卷C+Builder 与 Matlab 混合编程的两种方法杜高鹏翟正军 1*徐隽(西北工业大学 软件学院 , 西安 710065; dgp_2003 ; 西北工业大学计算机学院 1, 西安 710072摘 要 详细论述了 C+Builder 与 Matlab 混合编程的两种实现方法 。 一是在 C+Builder 中使用 COM 技术调用 Matlab 数据 。 二是脱离 Matlab 环境 , 通过动态连接库方式实现对 Matlab 工具箱函数的调用 。 分别给出一个详细的例子 。 这两种方法都充分发挥了 C+Builder 与 Matlab 的优势 , 为科学研
2、究和工程技术提供了更强的技术支持 。关键词C+Builder MatlabCOM 组件Mediva 软件平台 DLL中图法分类号 TP312文献标识码BMatlab 是一个高度集成的系统 , 它把数值计算和可视化环境集成到一起 , 非常直观 , 而且提供了 大量的函数 , 使其越来越受到人们的喜爱 。 它集科 学 计 算 、 图 象 处 理 、 声 音 处 理 于 一 体 , 具 有 极 高 的 编程效率 。 近年来 , Matlab 已经从最初的 “ 矩阵实验 室 ” 渗透到科学与工程计算的多个领域 , 在自动控 制 、 信号处理 、 神经网络 、 模糊逻辑 、 小波分析等多 个方向 , 都
3、有着广泛的应用 。 Borland C+Builder 是 一种新颖的可视化编程语言 , 它既具有 C+语言的 灵活性 、 高效性 , 又具有可视化编程的便利性 , 功能 丰富强大 , 界 面友好 , 使用 十分方便 , 但是在矩阵 运 算 、 数值分 析 、 工程计算 等方面 , 功能 则稍嫌不 足 ; 在工程应用中 , 我们一般用 C+Builder 语言编写应 用 程 序 , 实 现 交 互 界 面 、 数 据 采 集 和 端 口 操 作 等 , 但 C+Builder 在数值处理分析和算法工具等方面 , 其效率远远低于 Matlab 语言 。 在准确方便地绘制数 据 图 形 方 面 ,
4、 Matlab 语 言 更 具 有 无 可 比 拟 的 优 势 。 此外 , Matlab 还提供功能强大的工具箱 。但 Matlab 的 缺点是不能实现端口操作和实时控制 。 因此 , 若能 将两者结合运用 , 实现优势互补 , 将大大提高工作 效率 。1C+Builder 与 Matlab 混合编程的实现方法C+Builder 与 Matlab 混合编程有两种实现方法 。一种是基于 Matlab 环境支持 , 通过在 C+Builder 中使用 COM 技术调用 Matlab 数据实现 ; 另一种则是完全 脱离 Matlab 环境 , 通过动态连接库方式实现对 Matlab 工 具 箱 函
5、 数 的 调 用 , 这 可 以 通 过 一 种 开 发 平 台Mediva 来实现 。 相对来说 , 前者的限制因素较多 , 而后者则较为方便灵活 。1.1COM 方法的实现COM 是组件对象模型的简称 , 是 Windows 对象 的二进制标准 。 为 Windows 提供了统一的 , 面向对象的 , 可扩充的通讯协议 。 这意味着描述一个对象的可执行代码 (.dll 或 .exe 文件的代码 可以被其它对象 执行 。 即使两个对象使用不同语言来编写的 , 他们 可以用 COM 标准来进行通信 。 在 C+Builder 中使用COM 技术调用 Matlab 数据实现方法如下 :(1 根据
6、实际需要在 Matlab 中开发算法 , 写成函数文件的形式 (注意 :不能是脚本文件 , 必须是函数 文件 ;(2 利用 Matlab 的 COM Builder 将 M 函数编译为COM 组件 ;(3 在 C+Builder 中调用 COM 组件 , 得到输出 。下面给出一个实例加以分析 。问题 :实验对象为 :G (s =1/(Js2+Bs 在 Matlab 中 采用 M 函数的形式 , 利用 ODE45求解对象方程 , 然后 在 C+Builder 中进行仿真 , 跟踪给定信号 。2005年 12月 2日收到第一作者简介 :杜高鹏 (1980 , 男 , 陕西西安人 , 硕士研究生 ,
7、 研究 方向 :计算机网络及数据库 。*通讯作者简讯 :翟正军 , (1965 , 男 , 教授 , 硕士生导师 。 研究方 向 :计算机测控与仿真 。第 6卷 第 7期 2006年 4月1671-1815(2006 07-0886-04科 学 技 术 与 工 程Science Technology and Engineering Vol. 6No. 7Apr. 20062006Sci. Tech. Engng. c杜高鹏 , 等 :C+Builder 与 Matlab 混合编程两法 7期1 在 Matlab 中编写程序 genzong.m 和 cha.m 其代码如下 :function b=
8、genzong (a ;xk=a(1 ; a(2;para=a(3 ; ts=a(4 ; tspan=0ts;tt,xx=ode45(' cha' ,tspan,xk,para ;xk=xx(length(xx, ; ;y=xk(1 ; y1=xk(2 ;b(1=y ; b(2=y1;以及对象方程 :function dy=cha(t,y,flag,parau=para ; J=0.0067; B=0.1;dy=zeros (2, 1 ; dy (1 =y (2 ; dy (2 =-B/J*y (2 +u/J ;2 用 Matlab 的 COM Builder 制 COM 组件
9、首先 , 设置 Matlab COM Builder 所使用的外部编 译器 , 在 Matlab 命令窗口下输入 mbuild setup , 然后选 择合适的编译器 , 在这里选择 Microsoft Visual Studio 6.0, 其它的按照提示即可 。 其次 , 在 Matlab 命令窗口 下输入命令 comtool , 启动 COM Builder 的图形用户界 面 , 然 后 使 用 File->New Project 建 立 新 工 程 , 在 Component name 中输入要生 成的 COM 组件的 名字 , 例如需输入名字 xj 。 通过 Add 和 Remo
10、ve 按钮可以方 便地为组件添加和删除类 。 在这里 , 笔者为这个组 件添加一个类 xj 。 在 Compile Code in 里面推荐选择 C 。 如果要使用 Matlab 的图形库 , 那么就要在 Compile options 中 选 中 Use Handle Graphics Library 。 选 中 Show verbose output 可以在编译的时候输出 详细的 过程信息 。 一个组件可以包含许多类 , 添加的方法 就是在 Project Settings 里面添加 。 给一个类添加一个 方法非常简单 :先选中一个类 , 然后使用按钮 Add File 添加 M 文件就可
11、以了 , 该 M 文件的名称就是 COM 组件的方法 。3 在 C+Builder 中使用生成的 COM 组件点击 C+Builder 的 Project->Import Type Library , 在 上 面 的 窗 口 中 找 到 xj 1.0Type Library Version 1.0, 点击 Install 按钮 。 此时就在 AxtiveX 控件页安装 了 xj 控件 , 建立 一个工程文 件 project1, 在 Form 上 放 置一个 IstripChart 控件 , 一个 Timer 控件 (运行时不可 见 和两个按钮控件 Button1, Button2。 双
12、击 Button1, 添加如下代码 :void _fastcall TForm1:Button1Click(TObject *Senderxk1=0; xk2=0;para=0; ts=0.001; EK_1=0; k=0;Timer1->Enabled=true ;双击 Timer1, 添加如下代码 :void _fastcall TForm1:Timer1Timer(TObject *Senderk=k+1;SDZ=sin(2*3.1415*k*ts ; /给定信号double src4; double out2; /传出数据数组SAFEARRAY InSafeArray ; /用于
13、传入的安全数组TVariant a ; TVariant b ; /传入传出 COM 的变体src0=xk1; src1=xk2; src2=para ; src3=0.001; /tsInSafeArray.cDims=1; /设置输入安全数组InSafeArray.fFeatures=FADF_AUTO ;InSafeArray.cbElements=sizeof(float ;InSafeArray.rgsabound0.lLbound=0;InSafeArray.cLocks=1;InSafeArray.rgsabound0.cElements=4;InSafeArray.pvData
14、=src ;a. SetSAFEARRAY(&InSafeArray ;a.vt=VT_R8|VT_ARRAY ;xj1->genzong(1,&b,a ; /调用 COM 的方法memcpy(out,b.parray->pvData,2*sizeof(double ;xk1=out0; xk2=out1; /传出数据EK=SDZ-xk1; dEK=(EK-EK_1/0.001; U=20*EK+0.5*dEK ; if (U>=10 U=10; if (U<=-10 U=-10;para=U ; EK_1=EK ;iStripChart1->Be
15、ginUpdate( ; /仿真曲线的绘制int TimeIndex=iStripChart1->AddIndexTime(Now( ;iStripChart1->ChannelData0TimeIndex=xk1;iStripChart1->ChannelData1TimeIndex=SDZ ;iStripChart1->EndUpdate( ;双击 Button2, 添加如下代码 :void _fastcall TForm1:Button2Click(TObject *SenderTimer1->Enabled=false ;运行程序 , 得到仿真界面 。用
16、COM 方法实现 C+Builder 与 Matlab 混合编程 简单易懂 。 如果用户运行时想要脱离 Matlab 环境 , 只 需 在 Matlab 中 通 过 菜 单 Component ->Package Component 将组件打包即可 。1.2Mediva 软件平台Mediva 是 Mathtools 公司推出的一种 Matlab 编译 开发软件平台 , 提供对 Matlab 程 序文件 (M 文件 的 解释执行和开发环境支持 。 Mediva 软件平台本身的 功能相当强大 , 提供近千个 Matlab 的基本功能函数 , 通过必要的设置 , 就可以直接实现与 C+的混合编
17、 程 , 而不必再依 赖 Matlab ; 同时 , Mediva 还提 供编译 887科 学 技 术 与 工 程 6卷转换功能 , 能够将 Matlab 函数或编写的 Matlab 程序转 换为 C+形式的 DLL , 从而实现脱离 Matlab 环境对 Matlab 函数和过程的有效调用 , 这样就有可能实现 对 Matlab 强大的工具箱函数的利用 。Mediva 的缺点是 C+与 Matlab 混合编写的应用 软件必须携带必要的 DLL , 从而增大了软件的体积 (约 4M , 同时 也不能对所 有的 Matlab 函数提 供 支 持 , 例如采用类库进行设计的部分函数 。 但尽管如
18、此 , 对于控制系统计算机设计 、 分析的工作来说 , Mediva 仍不失为一个好的工具 。 其实现方式和步骤 如下 :本文假设已经安装了 Mediva 软件或已经得到必 要的两个动态连接库 mdv4300.dll 和 ago4300.dll 。 1.2.1Lib 文件的生成在 Dos 下用 C+Builder 中的 Implib.exe , 通过命令 生成 mdv4300.lib :implib mdv4300.lib mdv4300.dll , 将上述两个 DLL 文件和此 Lib 文件拷贝到当前目录 下 。1.2.2实现与 Matlab 的混合编程Matlab.h 包含了 Mediva
19、 中所有类型 、 常量 、 函数 的说明和定义 , 必须将此头文件放于程序 的第一 行 。 Mediva 给出的 Matlab 函数形式并不特殊 , 如绘 线函数 Plot , 在 Mediva 中说明为 :Mm DLLI plot (cMm varargin ; varargin 与 Matlab 中 的 意 义 是 一 样 的 , 与 输入变量的个数相对应 。 所有可以直接使用 的函 数都在 Matlib.h 头文件中定义 , 而在 mdv4300.dll 中 实现 。但在 C+Builder 中使用 Mediva 提 供 的 Matlab 函 数的格式 , 与 Matlab 编程稍有不同
20、 , 这主要体现在 C+中必须进行必要的说明上 。 例如要用绘线函数 Plot 来绘制数组 x 100的红色图线 。 在 Matlab 中调用 为 Plot (x , 'r' ; 在 C+中 调 用 则 为 :Plot (CL (x , TM ("r" , 其中 CL 是一个关键字 , 是多变量输入时所必 须使用的 , 用以指明调用的变量 ; 而 TM 则指明 , 这是 一个字符 。下面给出一个示例程序 , 其功能是对一个 1024点的输入数组进行 FFT 变换 , 并绘制变换后频谱实 部的火柴杆图 , 最后将原数据和变换后的数据写入 数据文件中 。#inc
21、lude "matlib.h"/必须包含的头文件#include vcl.h #pragma hdrstop#include "TryMatcomU.h"#pragma package(smart_init#pragma resource "*.dfm"TForm1*Form1;_fastcall TForm1:TForm1(Tcomponent*Owner:Tform(Ownervoid _fastcall TForm1:Button1Click(Tobject *Senderint k=0;initM (MATCOM_VERSIO
22、N ; /必须进行的初始化Mm cur1,cur2; /定义变量cur1=zeros (128 ; cur2=zeros (128 ; /变量初始化for (k=1; k<=128; k+cur1.r (k =randM ( ; /生成一个随机数列figure (1 ;plot (cur1 ; /图形显示该数列cur2=fft(cur1,128 ; /做 128点 fft 变换figure(2 ; /绘制 fft 变换后实部的火柴杆图 , 注意此处多变量输 入的格式stem(CL(cur1,real(cur2,TM("r" ;fid=fopen(filename,mo
23、de,format opensexitM( ; /退出调用如果完全使用 C+来实现本程序的工作 , 其代 码将超过 300行 ! 由此可以看出 , C+Builder 与 Matlab 函数的混合编程可以带来多么大的方便 !1.2.3变量内部状态 /数据的观察方法Mediva 使用的所有变量均定义为 Mm 类型 。 如果 在 C+Builder 中观察 Mm 类型变量的内部状态 /数据 , 要稍麻烦一些 。 但在调试程序时 , 这又是不可避免 的一步 , 这里举例给出变量观察的方法 。例如对上面生成的 cur2数列进行观察 :*cur2.pr 0.1892cur2(1 的实部*cur2.pi
24、0.0013cur2(1 的虚部2结语(1 基于 Matlab 环境支持 , 通过在 C+Builder 中 使 用 COM 技 术 调 用 Matlab 数 据 实 现 C+Builder 与 Matlab 的混合编程的优势很明显 , 在 C+中不易编写 的求解常微分方程 , 在 MATLAB 中只需寥寥数行便 能求解 , 只需在 C+Builder 中写好数据接口便能实 现仿真 。(2 Matlab 提供了可外部连接的 DLL 文件 , 通过888杜高鹏 , 等 :C+Builder 与 Matlab 混合编程两法7期 Two Methods of C+Builder and the Ma
25、tlab Mix ProgrammingDU Gaopeng , ZHAI Zhengjun 1*, XU Jun(Software College , Northwestern Polytechnical University , Xi'an 710065; Computer College ofNorthwestern Polytechnical University 1, Xi'an 710072Abstract Two realization methods of C+Builder and the Matlab mix programming are elaborat
26、ed in detail. First , transfer the Matlab data by useing the COM technology in C+Builder ; Second , separating from the Matlab environment , transfer Matlab toolbox function through dynamic connection storehouse way are presented.And a detail example is given. These two kinds of methods both gave fu
27、ll play to C+Builder and advantage of Matlab , and provided the stronger technical support for the scientific research and the project technology. Key words C+Builder Matlab Com module Mediva software platform DLL 将其转换为相应的 Lib 文件 , 并加以必要的设置 , 就可 以在 C+Builder 中直接 进行 Matlab 函数 调用 , 实现C+Builder 语言与 Mat
28、lab 语言的混合编程 。参考文献1Borland/Inprise , 梁志刚 , 等译 . C+Builder 5开发人员指南 . 北京 :机械工业出版社 , 20002北 京 宝 兰 -英 博 思 信 息 技 术 有 限 公 司 . Borland C+Builder 4标准教程 . 北京 :清华大学出版社 , 20003Hollingworth J 等 , 著 . 康向东 , 等译 . C+Builder 5程序设计大 全 . 北京 :机械工业出版社 , 20024罗建军 . Matlab 教程 . 北京 :电子工业出版社 , 20055潘爱民 . COM 原理与应用 . 北京 :清华大
29、学出版社 , 2005!An Effective Audit Mechanism for Detecting Authority Promoting AttackWU Hao , JIANG Xiangtao(School of Computer and Communication , Hunan University , Changsha 410082Abstract Providing a new aduiting mechanism for detecting authority promoting attack , based on modifing Linux kernel , adds aduiting mechanism in system call-execve. Through monitor the changes of process's real user ID , effective ID and save set-user-ID , i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 未来五年新形势下女半袖衫行业顺势崛起战略制定与实施分析研究报告
- 2026河南郑州烈士陵园公益性岗位招聘38人建设考试备考试题及答案解析
- 2026甘肃平凉市第三批市直单位公益性岗位工作人员招聘23人建设考试参考题库及答案解析
- 2026年黑龙江省建设投资集团有限公司面向社会公开招聘4人建设笔试参考题库及答案解析
- 2026年南平武夷山职业学院4月人才招聘建设考试备考试题及答案解析
- 2025年高频劳动调解面试题及答案
- 2025年病理科常见疾病病理诊断技术考核试题及答案解析
- 2026年铅山县专业森林消防大队公开招聘消防队员建设笔试参考题库及答案解析
- 2025年芜湖市劳动保障人力资源有限公司人才储备1人(十九)笔试备考试题及答案解析
- 2026河南商丘市永城市消防救援局政府专职消防员招聘30人建设考试参考题库及答案解析
- 2026蜂蜜行业市场深度分析及竞争格局与投资价值研究报告
- 科技新赋能智护帕全程2026世界帕金森病日科普与义诊指南
- 新能源汽车使用及高压安全防护试题库及答案
- (17)义务教育劳动课程标准日常修订版(2022年版2025年修订)
- 毕业设计论文-四足机器狗(吐血发布)
- 《学做“快乐鸟”》优秀课件
- 应用软件系统安全等级保护通用技术指南
- 6.3实数(第1课时)课件
- 农村土地永久转让协议书参考
- 园林生态公司招采部制度流程
- 中国建筑工程项目管理手册(第一版)
评论
0/150
提交评论