MATLAB外部程序接口实现方法研究
摘 要:介绍了四种Mat lab外部程序接口方法及其特点,详细说明利用mat lab的com builder开发com组件的方法,以及在vb、.net 、vc和Delphi环境下的调用com组件的方法。
关键词:MATLAB ,COM Builder,COM组件
引言
Mat lab是一种以矩阵和阵列为基本编程单元的科学工程计算语言,它提供了功能齐全的数学函数和各种工具箱,在矩阵运算、数值计算、数值信号处理、系统识别、神经网络、图像语音处理等许多方面得到了广泛的应用。Matlab的计算功能非常强大,即使是复杂的计算程序,开发效率也很高,其主要缺点是执行速度比较慢。在解决实际问题时,往往利用matlab实现矩阵运算等计算过程,其他语言工具再通过与matlab的接口调用计算过程,返回结果。这样,就可以将其他语言灵活高效的编程能力和matlab强大的计算能力有机结合起来。
1 Matlab接口的实现方法介绍
其他语言与Matlab接口的实现有多种方法,下面介绍四种常见的方法。
1.1利用文件传递数据
利用文件传递数据是一种简单、方便的方法。实际使用中,可以使用文本文件、dat文件等文件来传递数据。如果用二进制数据文件传递数据,要注意Matlab与其他语言中二进制数据所占用的字节数以及输入输出所对应得格式要相匹配。
这种方法可以把M文件编译成可独立执行的EXE文件,这个EXE文件通过读入其他语言中用于传递数据的文件的数据,经过计算后,将结果放到文件中,然后其他语言读出文件中的数据。这样,就可以避免在其他语言中进行复杂的数值计算。
1,2利用ActiveX技术
ActiveX是由Microsoft制定的一种独立于编程语言的组件集成协议,它不受开发环境的限制。ActiveX空间能够在不同的环境中使用,包括VC、Delphi、c++ builder等。可以利用自动化服务器和自动化控制器技术,实现matlab和其他语言的接口。
1.3利用Mideva平台
Mideva是Mathtools公司推出的一种matlab编译开发软件平台,是一个强大而完备的M文件解释和开发环境,它通过应用Matcom和实时编译技术而达到快捷的速度。该软件平台有为Borland c++、Visual basic和Delphi等编程语言开发的不同版本。Mediva具有编译转换功能,能够将matlab函数或编写的matlab程序转换为c++形式的DLL,然后在Delphi中调用动态库函数,这样就可能实现对matlab各种工具箱的调用。同时,Mediva提供了上千个基本功能函数,包括基本操作、命令等,通过必要的设置,就可以直接实现与其他语言的混合编程,而不必依赖matlab环境,前提是必须要有两个动态链接库mdv4300.dll和ago4300.dll。
1.4利用com组件技术
com是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用。Matlab6.5新推出的com builder就是把matlab下的程序做成com组件,供其他语言调用。
matlab com builder在编译生成com组件的时候需要借助于外部的编译器。因为并不是所有的编译器都能生成和microsoft相兼容的com组件。com builder目前支持下列编译器:Borland c++ builder,Microsoft Visual Studio 6.0, Microsoft Visual Studio .net等。设置matlab com builder所使用的外部编译器,可以通过在matlab的commandwindow中输入命令MBuilder-setup来实现编译器的设置,具体步骤只要按照matlab提示进行即可。
2 matlab的com builder 使用方法
我们先将一个图片放入c盘下,命名为1.jpg,再准备一个测试文件test.m,如下:
%读入并且显示图片
function rs_jpg
I=imread(‘c:.jpg);
Imshow(I);
然后,在matlab的workspace下输入comtool,就可以启动matlab com builder环境。点击工具栏上的File菜单下的new project新建一个工程,在component name栏里填上comtest,将classes栏里自动生成的comtest类删除,class name里填上一个testclass。compile code in选c或c++都可以,不过因为c性能较好,推荐选择c。如果使用matlab里的图形库,需要在compiler options中选中Use Handle Graphics Library,我们使用了图形功能,故选中该项。选中Build debug version会生成调试版本的com组件,在调试的时候,调试版本的com组件如果真有错误发生,就会有相应得错误提示信息,可以方便地定位错误发生的地方。选中Show ……可以在编译生成com组件的时候输出详细的过程信息。在工程创建制后,仍然可以通过菜单Project->setting…打开此窗口进行修改。
Matlab下可以给com组件中的类添加方法。具体操作如下:
使用菜单Project->Add File或者点击按钮Add File添加已经存在的m函数文件就可以了。在这里,我们点击Project->Add files,将test.m添加如工程。方法(函数)添加完后,就可以使用菜单Builde->Com Object或者按钮build进行编译。编译完后就会在matlab工作目录下的comtest目录下生成两个文件夹:一个是srv,里面存放一些中间文件;另一个是distrib,里面就是动态链接库形式的com组件文件等。在这里,编译后distrib\文件夹下生成一个comtest_1_0.dll,这就是做好的com组件。
3 调用com组件的方法
3.1 vb下实现调用
打开或者新建一个vb工程,点击project->reference,在弹出的窗口中找到comtest 1.0 Type Library,将左边的复选框选中,点击ok,此时便将此com组件添加到工程里了。
示意调用代码如下:
Dim testclass As testclass
Set testclass1=New testclass
Call testclass1.rs_jpg
3.2 c#.net下实现调用
打开或者新建一个c#项目(这里采用vs.net),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出窗口中选com,然后也找到comtest_1_0.dll,选择并确定即可。
示意调用代码如下:
omtest.testclasstestclass1=newcomtest.testclass();
testclass1.rs_jpg();
3.3 vc下实现调用
点击vc下的tools->ole/com objectviewer打开oleviewer工具,在oleviewer工具的右边选择type libraries,找到comtest 1.0 type library,选中并且右键,选择view,点save按钮,分别保存为comtest_1_0.h和comtest_1_0.c(也可以存为comtest_1_0.idl接口文件),我们就可以根据这两个文件实现对comtest_1_0.dll调用。
新建或打开一个vc工程,将comtest_1_0.h和comtest_1_0.c加入工程,并复制一个comtest_1_0.dll到工程目录下,由于comtest_1_0.dll还要用到mwcomutil.dll,所以将<matlabroot>
/extern/include/下的mwcomutil.h和mwcomtypes.h也加入工程中。
示意调用代码如下:
#import “mwcomutil.dll”
#import “comtest_1_0.dll”
#include “mwcomutil.h”
#include “comtest_1_0.h”
//初始化调用com
if (FAILED(CoInitialize(NULL)))
{
AfxMessageBox(“unable to
initialize COM”)
}
testclass *testclass1=NULL;
HRESULT hr=CoCreateInstance(CLSID_testclass, NULL,CLSCTX_ALL,IID_ testclass,(void**)&st);
if (SUCCEEDED(hr))
{
st->rs_jpg();
AfxMessageBox(“succeed”);
st->release();
}
else
{
AfxMessageBox(“unsucceed”);
}
3.4 delphi下实现调用
点击delphi的project->import type library…,出现图形窗口,找到testclass 1.0 type library,然后点击”install…”按钮,就在testclass控件页上安装了testclass控件。
打开或建立一个工程,在form上放一个testclass控件和一个按钮控件,然后在按钮相应事件中添加如下代码:
Procedure TForm1.Button1Click(Sender:TObject);
Begin
Testclass1.rs_jpg;
End;
4 打包
在matlab下的workspace里输入comtool,选择菜单flile->open project打开我们建好的工程文件comtest.cbl,再选择菜单component->package component就实现了打包。此时,可以在comtest\distrib文件夹里看,生成的comtest.exe就是打包后的解压程序,双击就会解压出一些文件,再点击解压出来的install.bat就可以实现安装。
5 结束语
通过应用编程接口,可以把其他高级语言灵活多变的编程能力和matlab的强大计算能力结合起来。matlab的com builder工具可以方便地把matlab程序做成com组件,为系统开发人员提供了简单、易用地应用程序接口。和其他接口方法相比,将matlab程序做成com组件,使其他语言工具和matlab的混合编程更加简单。
参考文献
[1]韩守红等.Delphi与Matlab接口的实现方法研究.微计算机信息.2001
[2]胡劲松等.基于COM的MATLAB与Delphi混合编程研究.计算机应用研究.2005


评论
“zip 1/0 error:no such file or directory
zip error:could not creat output file(distrib/contest.zip)”
为什么呢?望解答,谢谢!