Delphi与Matlab混合编程的设计与实现 联系客服

发布时间 : 星期一 文章Delphi与Matlab混合编程的设计与实现更新完毕开始阅读e9917d222f60ddccda38a0c4

//extern \ // //

//打开Matlab引擎函数:

//如果Matlab安装在本地计算机上,字符串cc中的内容为“{post.content}”,

//如果系统为客户机/服务器(Client/Server)的工作方式,Matlab安装在主机“host”上,可输入'\\host\\Matlib'。 //返回1,则执行开启成功;返回-1则说明引擎打开失败

extern \WINAPI MatOpenEng(far char *cc) {

if(ep) return 0;//如果已打开则退出 if(!(ep=engOpen(cc))) return -1; else return 1; }

//关闭Matlab引擎的函数

//返回1,则执行关闭成功;返回0则说明引擎本来就未开启 extern\ { if(ep) {

engClose(ep); ep=NULL; return 1; }

else return 0; }

//执行Matlab命令函数:

//返回1,则执行成功;返回0则说明引擎本未开启

extern\MatExec(far char *cc) { if(!ep) return 0; else {

engEvalString(ep,cc); //cc中放Matlab命令 return 1; } }

//根据已知数据创建mxArray变量:

//注:cc:Matlab变量名 num:数据的个数 dd:已知数据

extern\

{ if(!ep) return 0; else if(num<1) return -1; else {

mxArray *xx = mxCreateDoubleMatrix(1,num,mxREAL);

memcpy((char *)mxGetPr(xx),(char *)dd,num*sizeof(double)); //将数组dd复制到mxarray数组xx中。 engPutVariable(ep,cc,xx); //将mxArray数组xx写入到Matlab工作空间,命名为cc所指名字。 if(xx) mxDestroyArray(xx);//释放xx return 1; } }

//获取Matlab数据:

//注:cc:Matlab变量名 num:数据的个数 dd:返回数据

extern\ {

mxArray *result = mxCreateDoubleMatrix(1,num,mxREAL); //double *pData=NULL; // int i; if(!ep) return 0; else if(num<1) return -1; else {

result=engGetVariable(ep,cc); //取出欲得的数,赋值给result。 if(result) {

memcpy((char *)dd,(char *)mxGetPr(result),num*sizeof(double)); //将mxarray数组result复制到数组dd中。 mxDestroyArray(result); return 1; } else return 0; } }

四、编译,一般情况应该会成功,否则的话就是设置或者书写错误的问题了。看看Debug里面是不是有了一个DelphiMatlab.dll文件了。

五、由于这样生成的dll中的函数名被vc加上了一些固有符号:象@什么的。在delphi'中使用这个dll里面的函数时,就会出现找不到函数的情况,下面就是要规范输出函数名了:

新建一个def文件,命名为DelphiMatlab

打开加入:

LIBRARY \ EXPORTS MatOpenEng; MatCloseEng; MatExec;

MatCreateDoubleData; MatGetdoubleData;

六、再编译,ok!最好是在release状态下编译,这样生成的dll小很多。下一步就是要在delphi中用这个dll了。

2.17 利用COM技术实现Delphi动态调用MATLAB

一、引言

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

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

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

在应用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的方法,同时要求使用cd与mccsavepath命令设置MATLAB为编译器提供的搜索路径。

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

1. 编辑M文件

根据实际应用编辑M文件。MATLAB COM Builder编译的只能是函数文件,即以function开头的文件,不能是脚本文件。通过MATLAB的M文本编辑器来编辑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('曲线拟合')

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

2. 启动MATLAB COM Builder

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