采用数据中转方式实现Delphi与MATLAB数据交流
一、基本思路
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)MATLAB的启动
Delphi应用程序在前台运行,因此在应用程序中调用Windows函数 WinExec,即可执行 Matlab.exe。
(3)MATLAB后台运作
M文件只有在MATLAB集成环境中才能被识别和自动执行。根据后台要求,不能显式进入MATLAB集成环境。考虑到MATLAB环境变量由 matlabrc.m 文件定义,可以通过对该文件的修改(将MATLAB要完成的输入数据、进行计算、输出数据过程编写成M文件,加入 matlabrc.m 中),从而实现MATLAB的后台运作。
二、Delphi如何将数据传递给MATLAB
以下通过一个具体例子进行说明
示例要求
进行矩阵运算:(b' * b)^(-1) * b' * y'
其中:
-
b是t × 2矩阵 -
y是1 × t矩阵
Delphi实现代码
在Delphi应用程序中,采用以下程序段将参与运算的矩阵 b、y 保存成M文件,使MATLAB可以通过执行相应的M文件获得这些矩阵。
变量说明:
fb、fy:事先定义好的textfile类型文件变量
b[i,j]、y[i]:事先定义好的数组变量
'c:\matlabfile\delphiout\b.m':保存矩阵b的M文件路径及文件名
'c:\matlabfile\delphiout\y.m':保存矩阵y的M文件路径及文件名
创建保存矩阵b的M文件
// 注:在MATLAB中整个输入矩阵必须以"[]"为其首尾, // 矩阵的行与行之间必须用分号";"或回车分隔, // 矩阵元素必须由逗号","或空格分隔。 assign(fb, 'c:\matlabfile\delphiout\b.m'); Rewrite(fb); write(fb, 'b=['); for i := 0 to t-2 do for j := 0 to 1 do begin Write(fb, b[i, j]); if j < 1 then Write(fb, ',') else if (i < t-2) and (i = 1) then write(fb, ';') else write(fb, ']'); end; CloseFile(fb);
创建保存矩阵y的M文件
assign(fy, 'c:\matlabfile\delphiout\y.m'); Rewrite(fy); write(fy, 'y=['); for i := 1 to t-1 do if i < t-1 then write(fy, y[i], ',') else write(fy, y[i], ']'); CloseFile(fy);
三、MATLAB如何接收数据并进行计算
背景说明
由于M文件只有在MATLAB集成环境中才能被识别和自动执行,而根据后台运作的要求不能显式进入MATLAB集成环境。但可以通过对 matlabrc.m 文件的修改,将MATLAB要完成的操作编写成M文件,加入 matlabrc.m 中。
示例M文件编写
按照前面例题的计算要求,编写MATLAB接收数据、进行计算、数据输出的M文件,取名为 C:\matlabfile\Mymatlabfile.m。
步骤1:创建Mymatlabfile.m
用记事本输入以下代码,保存在自己的目录(如 C:\matlabfile\)下:
% 保存矩阵b的M文件 delphiout\b % 保存矩阵y的M文件 delphiout\y % 执行矩阵运算:m = (b' * b)^(-1) * b' * y' m = ((b') * b') * (y') % 输出计算结果 save c:\matlabfile\matlaboutfile.dat m -ascii -double % 退出MATLAB quit
步骤2:修改matlabrc.m
-
打开
matlabrc.m,将其保存为一个备份文件matlabrcbak.m -
对原文件进行编辑,将下列语句加在文件最后:
if exist('c:\matlabfile\Mymatlabfile.m') Mymatlabfile end
步骤3:启动MATLAB
完成上述内容后,只要在应用程序中启动MATLAB,就会自动完成相应操作。
四、在Delphi中如何启动MATLAB
将前面步骤处理完后,可以用以下程序隐式启动MATLAB:
copyfile('c:\dsm\matlabfile\Mymatlabrc.m', 'c:\matlab\toolbox\local\matlabrc.m', false); winexec('c:\matlab\bin\matlab.exe', SW_MINIMIZE);
五、Delphi如何接收MATLAB输出结果
结果输出方式
MATLAB将计算结果通过以下指令输出:
save c:\matlabfile\matlaboutfile.dat m -ascii -double
Delphi读取结果
通过以下程序获取计算结果,并将结果(double类型变量 mid)放进数组 a[i] 中:
// Fa为textfile类型变量 if FileExists('c:\matlabfile\matlaboutfile.dat') then AssignFile(Fa, 'c:\matlabfile\matlaboutfile.dat'); Reset(Fa); i := 0; while not Eof(Fa) do begin read(Fa, mid); a[i] := mid; i := i + 1; end; closefile(Fa);
六、还原MATLAB原始环境参数
在应用上述步骤完成接口后,还需要在应用程序中添加以下代码,以还原MATLAB原始环境参数设定:
copyfile('c:\matlabfile\matlabrcbak.m', 'c:\matlab\toolbox\local\matlabrc.m', false);
方案总结
| 步骤 | 内容 | 关键技术点 |
|---|---|---|
| 1 | Delphi数据导出 | 将矩阵数据写入M文件 |
| 2 | MATLAB启动 |
WinExec 隐式启动 |
| 3 | MATLAB计算 |
修改 matlabrc.m 实现后台执行 |
| 4 | 结果导出 |
MATLAB的 save 命令输出数据文件 |
| 5 | Delphi读取结果 | 读取ASCII数据文件 |
| 6 | 环境还原 |
恢复原始 matlabrc.m 文件 |
该方案实现了Delphi与MATLAB之间的数据中转式通信,充分发挥了Delphi在界面开发和MATLAB在数值计算方面的各自优势。