数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 3843|回复: 0

在Visual C++中调用Matlab的其他方法

[复制链接]
发表于 2003-7-1 05:44:56 | 显示全部楼层 |阅读模式


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”
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-3-29 20:12 , Processed in 0.077585 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表