source:http://www.delphibbs.com/keylife/iblog_show.asp?xid=2109
概述:本文阐述了如何利用Delphi灵活强大方便的编程能力和Matlab强大的科学计算能力,降低编写复杂算法的难度和时间,使Delphi算法程序的开发效率大大提高,收到事半功倍的效果。
关键字:Matlab、科学计算、接口、数据交换
引 言:
最近在搞一个数字图像加密的课题,其中涉及到大量的矩阵及其他科学运算,在用Delphi实现时,可以想象在编写算法的时候遇到了大量的问题,所以提出了这样一个想法:能否将后台运算模块通过某种接口的方式交由其他成熟的科学计算软件处理,而用Delphi从事其前台开发,这样将大大降低编写复杂算法的难度和缩短开发周期。相信这也是广大开发人员在遇到大量科学计算时所急待的问题,在论坛上也屡有人问起,笔者参阅了大量资料后归纳整理了几种方案,希望对大家有益^_^
Delphi与MATLAB数据接口方案探讨
前言:
Delphi作为一种功能强大的编程工具,具有易学易用、开发效率高,界面制作美观方便等优点,因此被很多程序员所青睐。Pascal作为历史上第一种结构化的高级语言,在从事复杂算法编写方面也有着诸多优点,可是在软件开发快速运作的今天,用Pascal原始开发一些复杂的算法,不仅编译效率不高而且也影响开发进度,因此Delphi如何与科学计算软件相结合,从而高效地完成编程任务成为一个困扰很多程序员的问题。而Matlab就正是一种高效率的科学工程计算语言,它在矩阵运算、数值计算、数字信号处理、系统识别、自动控制、神经网络、图形显示等方面比其它语言有难以比拟的优势。将Delphi和Matlab相结合,利用Delphi灵活强大方便的编程能力,Matlab强大的科学计算能力就可以开发出功能强大、操作灵活的软件。
以下给出5类数据接口方案供大家参考:
(为了便于大家浏览,几种方案将分贴显示)
方案一 采用数据中转方式实现Delphi与Matlab交流.....................................2楼
方案二 基于DDE技术的动态数据交换..................................................3楼
方案三 创造ActiveX对象实现数据交流................................................4楼
方案四 利用动态链接库技术实现二者交流.............................................5楼
方案五 利用mideva编译脱离matlab环境的动态链接库(注:此方法笔者尚未成功).........6楼
方案一 采用数据中转方式实现Delphi与Matlab交流
一、基本思路
Matlab输入数据的方法很多,其中利用M文件,直接把数据按元素列表方式引入Matlab工作内存方法,不仅语法简单,而且运行时只要输入文件名,Matlab就会自动按顺序执行M文件中的语句;Matlab数据输出的方法也有很多种,为了便于与Delphi应用程序接口,我们可以利用Matlab的指令Save输出数据。如指令Save outfile.dat x y -ascii -double,可将变量x和y以16位ASCII码形式存入outfile.dat文件。
基于上述matlab数据输入,输出的方法,我们可以利用M文件为中转,实现Delphi和Matlab的数据交换,当是要注意以下几点:
(1)由于Matlab的基本数据单位是矩阵,所以在delphi应用程序中我们只有通过文件变量,将参与运算的数据输出成M文本文件,以创建和保存矩阵数据。
(2)由于Delphi应用程序在前台运行,因此在应用程序中调用Windows函数WinExec,即可执行Matlab.exe。
(3)由于M文件,只有在Matlab集成环境中才能被识别和自动执行,而根据后台的要求不能显示地进入Matlab集成环境,考虑到Matlab环境变量由matlabrc.m文件定义,因此我们可以通过对matlabrc.m文件的修改(将Matlab要完成的输入数据、进行计算、输出数据过程、编写成M文件,加入matlabrc.m中),从而实现Matlab的后台运作。
二、Delphi如何将数据传递给Matlab
这里举例说明更直观一些^_^
例:进行矩阵运算(b'*b) -1 *b'*y', 其中b是t*2矩阵,y是1*t矩阵。
在Delphi应用程序中,可以采用以下的程序段将参与运算的矩阵b、y保存成M文件,这样Matlab就可以通过执行相应的M文件,获得参与运算的矩阵b、y。应用程序段如下:(程序段中fb、fy是事先定义好的textfile类型的文件变量,b[i,j]、y[i]是事先定义好的数组变量;'c:/matlabfile/delphioutb.m'是保存矩阵b的M文件路径及文件名,'c:/matlabfile/delphiouty.m'是保存矩阵y的M文件路径及文件名)
*********创建保存矩阵b的M文件*********
//注:在Matlab中整个输人矩阵必须以"[]"为其首尾,矩阵的行与行之间必须用分号";"或回车位隔离,矩阵元素必须由逗号","或空格分离。
assign(fb,'c:/matlabfile/delphioutb.m');
Rewrite(Fb);
write(fb,'b[');
for i:=0 to t-2 do
for j:=0 to 1 do
begin
Write(Fb,b[imk]);
if j<1 then Write(Fb,',')