[转载]在Visual C++中调用Matlab的其他方法

1. 利用Matlab引擎

Matlab引擎(Matlab engine)提供了一组 Matlab API 函数,用户不必关心这个Matlab引擎是如何实现的,只需要调用这些函数即可。正是通过这些 API 函数,实现了应用程序进程之间的传递数据,从而达到两者之间的良好结合。
Matlab引擎应用程序的实质是把Matlab作为一个引擎,允许从自己的Visual C++程序调用这个引擎。在运行时,引擎作为一个进程单独运行,此时Visual C++程序也作为一个进程单独运行,两者可以通过进程间的通信机制进行交互。
Matlab引擎采用客户和服务器计算模式。在运行中,Visual C++的C语言或C++语言的程序作为前端客户机,它向Matlab引擎传递命令和数据信息,并从Matlab引擎接收数据信息,Matlab引擎提供了下列几个函数:
engOpen:启动Matlab引擎
engClose:关闭Matlab引擎
engGetArray:从Matlab引擎中获得一个Matlab矩阵,用于数据交换
engPutArray:从应用程序向Matlab引擎发送一个Matlab矩阵,用于数据交换
engEvalString:执行一个Matlab命令
engOutputBuffer:创建一个用于存储Matlab文本输出的字符缓冲区

库文件的制作:
程序在Visual C++下编译,还需要用到相应的导入库libeng.lib,libmx.lib,libmat.lib和matlab.lib这几个动态链接库。在Matlab的安装目录Matlab\extern\include下,有以下几个定义文件:libeng.def,libmx.def,libmat.def,matlab.def。以libeng.def为例,用如下的命令生成导入库:
C:\MATLABR11\extern\include>lib/def:libeng.def /out:libeng.lib /machine:ix86
其中C:\MATLABR11为本地机器的Matlab安装目录,/out:libeng.lib指定的是输出文件,/machine:ix86是指所用的机器环境,这里的ix86是指支持Intel的处理器。
同样,生成libmx.lib,libmat.lib以及matlab.lib这几个相应的库文件。

库文件的加入:
把所生成的库文件加入到VC工程的Project->Settings->link->Object/Library Modules文本框中即可。

2. 利用Matlab自身的编译器调用工具箱中的函数

Matlab的编译器可将Matlab的M文件转换为C或C++的源代码,以便产生完全脱离Matlab运行环境的独立的运用程序,但Matlab本身的资料说明编译器如用来建立独立的运用程序,就不能调用Matlab工具箱中的函数,这非常不利于实现一些特殊的算法。然而工具箱中的函数既然是M文件,那么就一定可以用编译器来编译,以提供如Visual C++的调用函数,但是编译器只能编译一个独立的M文件,也就是说这个 M文件必须不依赖于其他的M文件。如果这个M文件中又调用了其他的M文件,那么可以将被调用的M文件拷贝到调用M文件的相应位置,并做适当的改动,这样就可以用编译器来编译。需要注意的是,编译器不支持图形函数,所以M文件中如果有图形函数,则需要将其注释掉。

3. 利用Matcom实现Visual C++和Matlab的结合

Matcom4.5是由MathTools公司推出的一个功能强大的软件(可在www.mathtools.com处获得,也可以在国内一些数学专业网站得到),它可以将Matlab的.M文件转换成具有相同功能的C++代码,这样既能够保持Matlab的优良算法,同时也利用了C++的高效率。也就是说,我们可以在Visual C++编译环境下创建友好的用户界面,而把一些较为底层的工作,如数据处理、仿真等交给Matlab来完成。
用Matcom来编译Matlab的.M文件的具体过程是这样的:
先把M文件按照与Matcom的cpp库的对应关系翻译为cpp源代码,然后用对应版本的C编译器将.cpp文件编译成相应的.dll或.exe文件。因此在第一次运行时,要指定所用的C编译器的路径,否则将无法编译。指定好的编译信息会写在Matcom\bin\matcom.ini文件中。在安装Matcom时,它会自动寻找编译器并将其信息写入matcom.ini文件。此外,由于Matcom4.5版本采用了TeeChart3.0 OCX控件,因此它能够支持图形操作。

4. 利用Visual C++进行外部调用

利用Visual C++进行外部调用的基本思路是这样的:首先把,M文件加入到一段C程序中去,然后通过Matlab中的mex批处理文件将该C文件生成.exe文件,再通过Visual C++的外部调用的函数ShellExecute()或WinExec()实现外部调用。
mex批处理文件的调用格式如下:
mex –f msvc60engmatopts.bat *.c
利用Visual C++的ShellExecute()函数调用的方法如下:
ShellExecute()函数是在应用程序中运行其他函数的,该函数既可以运行可执行文件,也可以使用相应的可执行文件打开数据文件。它的函数原形是这样的:
HINSTANCE ShellExecute (
HWND hwnd, //父句柄窗口
LPCTSTR lpVerb, //包含所要执行的操作的字符串
LPCTSTR lpFile, //文件名
LPCTSTR lpParameters, //包含可执行文件的参数的字符串
LPCTSTR lpDirectory, //默认路径
INT nShowCmd //所创建进程的显示方法
);
其中,参数lpVerb可以是“edit”、“find”、“open”、“print”、“explore”或“properties”

posted on 2007-04-06 15:48 ashura 阅读(4873) 评论(1)  编辑 收藏 引用

评论

# re: [转载]在Visual C++中调用Matlab的其他方法[未登录] 2007-10-10 19:30 Jeffrey

文章很好。请问能不能直接通过COM接口调用matlab中的数学函数。请邮件回复szkwkd@126.com,有代码示例最好。谢谢。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2024年12月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

导航

统计

常用链接

留言簿(2)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜