当前位置:服务支持 >  软件文章 >  MATLAB与Visual C++混合编程实践指南:接口调用、数据交换与联合编译方法

MATLAB与Visual C++混合编程实践指南:接口调用、数据交换与联合编译方法

阅读数 6
点赞 0
article_banner

MatlabVC混合编程


关键词:Matlab VC 混合编程 可执行程序


介:本文介绍了一种将Matlab编译成可执行程序的一种方法,它使得Matlab编写的程序能够完全脱离Matlab这个环境来执行,从而大大提高了程序的应用范围和使用价值。


众所周知,MATLAB是一套功能非常强大的商业数学软件,从信号处理,语音处理,数据采集,数值运算,图像处理,到电子仿真,金融分析等等,几乎在各个工业领域,他都已经得到了广泛应用,同时也取得了巨大的成功。


但是,由于Matlab是用一种脚本语言,他的解释是逐行执行的,程序中所有的变量都是用MxArray来实现的,所以为了保证通用性,它的执行效率非常低,这就是我们常常看到的:在开发一些复杂的算法时,通常会发现程序执行得特别慢,虽然Mathworks公司已经在竭力提高m脚本文件(script files)的运算速度,但目前为止效果仍然不能和实现同样功能的可执行程序相比。而且m脚本文件是不能脱离Matlab这个应用程序环境,这就大大制约了程序的可移植性和通用性。


本文的目的正是基于上述考虑,介绍如何利用matlab提供的C/C++编译器,将m文件编译成可执行的应用程序。作者是用的编译环境是:MS VC++ 6.0和Matlab6.5。



一、 MATLAB中的操作


1.没有使用图形相关的函数


由于MATLAB的编译器只能对函数m文件进行编译,所以如果原来的程序是脚本程序应改写成函数形式。举例如下:


建立一个m文件test1.m,内容如下:


function y = test1(n)


y = 1 ;


for i = 1 : n


y = y * i ;


end


用如下命令对其进行编译:”


mcc –t –L CPP –h test1.m


(如果程序由多个m文件组成,在编译命令中只需要指定主文件即可,mcc会自动查找相应的m文件进行编译)


编译完成后会得到与m文件名相对应hpp和cpp文件,本例中是test1.hpp和test1.cpp。


2. 使用了图形相关的函数


建立一个m文件test2.m,内容如下:


function test2


plot(rand(10));


用如下命令编译:


mcc –p –B sglcpp test2.m


(如果程序由多个文件组成,处理方法同上)


编译完成后得到与m文件名相对应的hpp和cpp文件、一个主函数文件、bin目录中的两个Fig文件以及一个exe文件。我们需要的只是与m文件相对应的hpp文件、cpp文件以及bin目录中的两个fig文件,本例中是test2.hpp,test2.cpp以及bin目录中的FigureMenuBar.fig和FigureToolBar.fig。



二、 VC中的操作


相比MATLAB中的操作,VC中需要设置众多的编译选项,显得比较复杂。另外,VC中可选的工程类型比较多,本文将说明MATLAB编译得到的源程序在如下工程类型中的使用


MFC Appwizard(exe) (Dialog Based)


Win32 Console Application


Win32 Application


其实在这几种类型的工程中大部分的操作都是相同的,本文先描述相同的操作,再说明不同的部分。


1.用VC建立相应类型的工程,把第一步中提到的源程序拷贝到工程所在目录中。


2.选择菜单Tools-Options-在属性页中选择Directories-下拉框中选择Include Files,在其最后加入


E:\MATLAB6P5\EXTERN\INCLUDE\CPP


E:\MATLAB6P5\EXTERN\INCLUDE


其中E:\MATLAB6P5为MATLAB的安装路径,如下图所示:













再在下拉框中选择Library Files,在最后加入


E:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60


E:\MATLAB6P5\EXTERN\LIB\WIN32


如下图所示:














3. 选择菜单Project-Settings-属性页Link-下拉列表中选择Input,在Object/library modules文本框中加入 libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib


注意下面的Ignore Libraries文本框,这里需要根据不同的工程类型进行填写,稍后再分情况说明。如下图所示:



4. 选择C/C++属性页,在下拉列表中选择Preprocessor,在Preprocessor definitions中加入MSVC,IBMPC,MSWIND如下图所示:














再在下拉框中选择Precomplied Headers,选中Automatic use of precompiled headers,在其中填入stdafx.h,如下图


















5.菜单Project-Add To Project-Files把所有拷贝过来的cpp文件加入到当前工程中。



下面再依各种不同类型的工程具体说明


1. MFC Appwizard(exe) (Dialog Based)


(仅以带图形函数的为例,所以需要把test2.hpp和test2.cpp以及两个fig文件拷贝到当前工程中)在主对话框上添加一个Button,并添加按钮的相应函数OnButton1。


在按钮响应函数所在文件中添加如下代码:


#include "test2.hpp"


在按钮相应函数中添加如下代码:


test2();


在对话框类的OnInitDialog函数中添加如下代码:


libmmfileInitialize();


libmwsglmInitialize();


mlfHGInitialize(NULL,NULL);


在对话框的消息WM_DESTROY的处理函数OnDestroy()中加入如下代码:


mlfHGTerminate();


libmmfileTerminate();


libmwsglmTerminate();


在上面提到的Ignore Libraries里加入msvcrt.lib,此时即可以编译成功了。


2. Win32 Console Application


这里建立了一个支持MFC的程序,以不带图形的函数为例,把test1.hpp和test1.cpp拷贝到当前工程中,


#include "stdafx.h"下面加入


#include "matlab.hpp"


#include "test1.hpp"


// TODO: code your application's behavior here.下面加入如下代码:


mwArray y,n;


n = 3;


y = test1(n);


double *py = mxGetPr(y.GetData());


printf("%f\n",*py);


在上面提到的Ignore Libraries里加入msvcrt.lib,由于MATLAB的库函数与VC的输入输出函数cout、cin、cerr冲突,所以需要把MFC生成的代码中


cerr << _T("Fatal Error: MFC initialization failed") << endl;一行删掉,并且在以后的代码中页不能有cout、cin、cerr。


3. Win32 Application


选择建立"A simple Win32 Application",这样的工程中默认是没有主窗口的,只有一个WinMain函数,以带图形的函数为例,把test2.hpp test2.cpp以及


FigureMenuBar.fig和FigureToolBar.fig拷贝到当前工程中。


在#include "stdafx.h"下面添加


#include "test2.hpp"


在WinMain函数中添加如下代码:


libmmfileInitialize();


libmwsglmInitialize();


mlfHGInitialize(NULL,NULL);


test2();


mlfHGWaitForFiguresToDie();


mlfHGTerminate();


libmmfileTerminate();


libmwsglmTerminate();


此时编译能够成功,但会出现两个警告信息,在Ignore Libraries里加入msvcrt.lib,libcd.lib即可去除该信息。



三、 程序的发布


由于程序中调用了MATLAB数学函数库或图形库中的函数,所以需要附带MATLAB的这些函数库才能在没有安装MATLAB的机器上运行。幸好MATLAB已经把这两个库的函数打包了,这样就省得我们一个一个去搜集了。该文件就是位于matlab安装目录中extern\lib\win32子目录中的mglarchive.exe。运行该程序即可自动把需要的库函数解压到当前目录中,把编译好的程序放到该目录中拷贝到未装matlab的机器上即可实现脱离matlab。




作者简介:


姓名:苗春葆
性别:男
工作单位:国家海洋信息中心
毕业院校:中国海洋大学
所学专业:物理海洋学
编程语言:Matlab,Fortran,VB,VC



参考书目:


Matlab® USER Manual


Microsoft MSDN

转自:http://www.simwe.com/jour/prog/p001008.htm


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空