你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 编程语言
2.17 利用COM技术实现Delphi动态调用MATLAB
 

一、引言

MATLAB是一种高效率的科学工程计算语言,它在矩阵运算、数值计算、数字信号处理、系统识别、自动控制、神经网络、遗传算法、支持向量机、图形显示等方面比其他语言有无法比拟的优势,目前它已成为研究人员必不可少的工具软件。Delphi语言是一种功能强大的面向对象编程语言,具有快速开发、易学易用、界面制作美观方便等优点。

MATLAB交互性能较差,程序的通用不强,从而导致其效率降低,而Delphi在数值处理分析和算法工具等方面的开发难度大,其能力远远低于MATLAB语言,为此,将两者结合运用,可实现优势互补,获得更大的效益。由于MATLABDelphi软件本身并没有提供数据互调的接口,所以关于如何实现两者的接口成为目前研究的热门问题。

COM(Component Object Model)Windows提供的一种面向对象的、可扩充的通信协议,本系统采用MATLAB自带的COM Builder来生成COM组件,从而实现MATLABDelphi之间的数据通信,经反复试验表明,该方法开发过程相对简单,使用简便,是值得提倡的一种好方法。

二、外部编译器

在应用MATLAB COM Builder编译生成COM组件之前,应先安装外部编译器,因为MATLAB COM Builder只能借助于外部编译器才能编译生成COM组件。MATLAB COM Builder只支持下列编译器:Borland C++ Builder (3, 4, 5,6)Microsoft Visual Studio (5.0, 6.0)Microsoft Visual Studio.NET。笔者使用的是Microsoft Visual Studio 6.0编译器。

三、MATLAB编译环境的配置

在首次使用MATLAB COM Builder编译生成COM组件前,必须对MATLAB COM Builder所使用的外部编译器进行配置。方法是:启动MATLAB,在Command Window中输入命令mex-setup后按回车,会显示下列信息:

Select a compiler:

[1] Lcc C version 2.4 in D:\MATLAB\sys\lcc

[2] Microsoft Visual C/C++ version 6.0 in D:\Program Files\Microsoft Visual Studio

[0] None 

Compiler:

提示用户选择外部编译器,输入2,表示选择Microsoft Visual Studio 6.0为外部编译器,然后回车,会显示许多编译器设置的有关信息,并说明使用MATLAB Visual Studio 添加MATLAB C/C++ Compiler的方法,同时要求使用cdmccsavepath命令设置MATLAB为编译器提供的搜索路径。

假如工作路径为e:\matlabM文件也要存放在该文件夹中),在Command Window中输入cd(‘e:\matlab’);按回车,接着输入mccsavepath;再按回车,保存当前路径。

四、COM组件

1. 编辑M文件

根据实际应用编辑M文件。MATLAB COM Builder编译的只能是函数文件,即以function开头的文件,不能是脚本文件。通过MATLABM文本编辑器来编辑M文件,可以单击MATLAB桌面上的New M-File图标,或单击菜单File→New→M-File,打开空白的M文件编辑器。将编辑好的M文件保存到设置的MATLAB路径下(本文为e:\matlab)。

为全面展现M文件与其编译生成的COM组件的对应关系,本文以学习与工程上广泛应用的最小二乘曲线拟合为例来说明。对于曲线拟合,MATLAB只需要几句代码,而如果直接在Delphi中编程则十分复杂。M文件取名为curvefit(文件名必须与函数名一致),其代码如下:

function [p,z]=curvefit(x,y)

global N;

p=polyfit(x, y, N);

xi=linspace(0, 1, 100);

z=polyval(p, xi);

plot(x, y, ' o ' , x, y, xi, z, ' k- ' )

xlabel(' x '), ylabel(' y=f(x) '), title('曲线拟合')

该函数有两个输入变量xy,为需拟合的数据组;还有两个输出变量pzp为拟合曲线;N为拟合曲线的阶次。该函数的功能为接受用户设定的拟合数据与曲线阶次,执行拟合,并将拟合效果图与拟合曲线传给用户。该函数虽然简单,但几乎包含了所有动态接口方法,具有代表性。

2. 启动MATLAB COM Builder

首先启功MATLAB,在Command Window中输入命令comtool后按回车,或者在MATLAB窗口的左下角点击Start按钮,然后MATLAB MATLAB COM BuildeMATLAB COM Builder,此过程如图1所示。上述两个方法均可以启动MATLAB COM Builder,其窗口如图2所示。


 

1 MATLAB COM Builder启动操作过程    2  MATLAB COM Builder窗口

3. 编译M文件

MATLAB COM Builder中点击File菜单,选择New Project…,弹出New Project Settings窗口;在Component name文本框中输入要生成的COM组件的名字,如curfitclass,输入后会自动产生curfitclass类,并在Classes中出现,可使用AddRemove增加或删除类;Project version是为了用户方便地管理自己所生成的COM组件而设置的,通过这个版本号,用户可以方便地区分不同时期制作的相同名字的COM组件;Project directory是整个工程存放的目录;因为C代码性能较好,在Compile code in里面推荐选择C;在Compiler options选项框中有三个选项,Use Handle Graphics Library表示使用MATLAB的图形库,即使用画图功能;Build debug version表示生成调试版本的COM组件,调试版本的COM组件在调试的时候如果有错误发生,就会有相应的错误提示信息,可以方便地定位错误发生的地方,而不是Debug版本的COM在出错时不会给出任何的错误提示信息;Show verbose output表示在编译生成COM组件的时候输出详细的过程信息。New Project Settings窗口的设置如图3所示。

New Project Settings窗口设置完毕并点击OK后,需要向建立的类中添加M文件,其方法是在Project Files里面选中要操作的类,单击Add File按钮添加现成的(预先编写好的)m函数文件。本文需把curvefit.m文件加入,这样就为类添加了一个方法。所有函数添加完毕之后,就可以使用菜单Build→COM Object或者单击按纽Build进行编译。当Build Status中出现Standalone DLL build complete.时,表示COM组件已经编译完成,如图4所示。编译完毕之后会建立一个以类命名的文件夹,里面又包含两个文件夹:一个是src,里面存放的是一些中间文件;一个是distrib,里面就是动态链接库形式的COM组件文件,即我们需要的DLL文件。在编译完毕之后,MATLAB会自动注册生成的组件。


 

           

3 New Project Settings设置窗口   4 COM组件编译完成信息

单击Component→Component Info…可以查看所建组件的详细信息,如图5所示,其中包括组件中的类、方法、属性、事件等。类curfitclass包括方法curvefit()、属性N。可以看出,只需按一定格式设计M文件,COM组件就会自动转换:M文件中的函数被编译为方法,用global声明的全局变量编译为属性,包含注释“%#event”的函数则被声明为事件。



 

5 生成的COM组件信息                    6  DelphiCOM组件的安装

五、动态调用COM的组件

1. 安装COM组件

启动Delphi,点击DelphiProject→Impot Type Library…,出现如图6所示的界面。在上面的窗口中找到curfitclass 1.0 Type Library [Version1.0],然后点击Install…按钮就在ActiveX类组件页中出现curfitclass组件,如图7所示,此时就可以应用该组件了。


 

7 位于ActiveX类中的curfitclass组件

 

2. 应用COM组件

Delphi中新建工程Project1,按图8布置Form1窗体,其中部分组件功能如下表所示。实现的核心代码如下:

Form1中的组件表

组件

设置

功能

curfitclass1

调用MATLAB

Edit1

Text为空

输入拟合数据组个数

Edit2

Text为空

输入拟合曲线阶次

Edit3

Text为空

输出拟合曲线

Button1

Caption为“确定”

建立数据输入文本框

Button2

Caption为“拟合”

执行COM组件并传递数据


       

8 窗体布置                            

var

Form1: TForm1;

arredt:array[1..11] of TEdit;   //声明文本框组件数组;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var datacount, counter:Integer;

begin

datacount:=StrToInt(Edit1.Text)*2;

for counter := 1 to datacount do

begin

arrEdt[counter]:= TEdit.Create(Self);   //创建文本框组件;

if counter>11 then

begin

arrEdt[counter].Top := 80+(counter-11) * 30;

arrEdt[counter].Left := 260;

end

else

begin

arrEdt[counter].Top := 80+counter * 30;

arrEdt[counter].Left := 100;

end;

arrEdt[counter].Height := 16;

arrEdt[counter].Parent := Form1;

end;

end;

procedure TForm1.Button2Click(Sender: TObject);

var

i:Integer;

x,y,m:OleVariant;   //传入COM的变体;

p,z:OleVariant;   //传出COM的变体;

q:Pointer;   //定义指针;

outq:array[1..3] of Double;   //传出数据数组;

begin

p:=VarArrayCreate([1,3],varDouble);    //以给定的界限和维数建立变体数组,以下同;

z:= VarArrayCreate ([1,100], varDouble);

x:= VarArrayCreate ([1,11], varDouble);

y:= VarArrayCreate ([1,11], varDouble);

m:= VarArrayCreate ([1,1], varDouble);

m[1]:=StrToInt(Edit2.Text);

curfitclass1.N:=m;   //利用COM组件属性传入数据,本文为曲线阶次;

for i:=1 to 11 do    //传入数据赋值;

begin

x[i]:=StrToFloat(arrEdt[i].Text);

y[i]:=StrToFloat(arrEdt[i+11].Text);

end;

curfitclass1.curvefit(2,p,z,x,y); 

 //调用COM组件的方法,2为输出的数目,pz为输出变体,xy为输入变体;

q:= VarArrayLock(p);   //锁定输出变体数组;

try

begin

move(q^,outq[1],3*SizeOf(double));//读取指针内容;

edit3.Text:='y='+Copy(FloatToStr(outq[1]),1,6)+'x2+'+Copy(FloatToStr(outq[2]),1,6)+'x'+Copy(FloatToStr (outq[3]), 1,6);   //传出曲线方程;

end

finally

VarArrayUnlock(p);   //解锁输出变体数组;

end;

end;

本程序展示了DelphiMATLAB COM组件之间数据传入与传出接口的实现方法。可以看出,应用本程序只需输入拟合数据与阶次,就可以快速得出拟合方程与拟合效果图,方便简捷,应用性强。程序运行界面如图9所示。


9 程序运行界面

 

六、 结语

应用Delphi动态调用MATLAB,可以使开发人员在从事有关科学工程、数值运算等问题时从繁琐的数学编程中解脱出来,从而减少算法编程的时间,缩短开发周期。读者可以在本文开发程序的基础上,根据实际应用需要稍加改造,即在拟合数据的输入上稍加扩展,就可以得到自己的曲线拟合应用程序。通过本文的应用表明:COM Builder工具大大减轻DelphiMATLAB混合编程的难度,增强了对图形的支持和程序的通用性,具有较高的运行效率。作为MathWorks公司力推的混编工具,COM Builder会进一步完善,这种新的混编技术无疑将是今后混合编程的发展方向。本文可以为初学者提供很好的参考,同时对有基础者也会有一定的启发。本文所有程序在Windows XPDelphi 7.0MATLAB 6.5下编译、调试通过。

 

 

  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089