马上要考试啦,而且还要写报告做实验,可就是打不起精神来准备。突然想起来写写blog,这次想写的是关于matlab混合编程的东西,以便日后用得着的时候可以方便的查看。
关于为什么要进行matlab的混合编程的原因,现在不想去仔细地调查了,哪天有兴致了再写吧。matlab的混合编程范围也很广,包括与C,fortran,Basic等各种高级语言的混合编程,我呢,只对C还稍稍有点认识,就写C的。
matlab与C的混合编程包括在C中调用matlab和在matlab中调用C。先写在C中调用matlab吧。在C中调用matlab可以使用matlab引擎,也利用matlab编译器。嗯,先写利用matlab编译器的。
关于这个编译器的介绍,等考完PLD了,再去仔细地调研一下。这篇呢就从一个简单的例子来讲述一下怎么利用matlab的编译器来进行混合编程。
首先,启动matlab,编写一个简单的函数M文件,myplot.m:
function myplot()
n = 0:0.01:1;
y = sin(2*pi*n);
plot(n,y)
NOTE:就目前来说,matlab还只支持函数M文件的编译,而不支持脚本M文件,所以一定要写成函数M文件。
写完M文件之后,必须对文件进行编译。在编译之前,必须对编译器进行配置(这个步骤只需进行一次,下次再用时就不用再进行配置了)。配置使用的命令是mbuild -setup。然后按着提示选择y/n和123就好了。
配置完成之后,就可以进行编译了。编译使用的命令是mcc。mcc函数可以带多种参数,关于各个参数的含义以后再说吧。在这里使用:
mcc -W cpplib:libmyplot -T link:lib myplot.m
Note:这里libmyplot是生成的lib文件的文件名,myplot.m是待编译的文件。使用这个命令将会生成一序列不同格式的文件,在后面将会利用到。这个过程比较慢,要耐心等待,别以为是程序有问题然后就给关了,呵呵。
这些是用matlab来实现的步骤,下面就要开始用c来调用了。
先要对vc的预编译路径进行设置。我用的是VC++6.0,设置的方法是:
在tools\options\directions下的show directions for下的组合框选include files项,添加"%matlab\extern\include",再选择library files项,添加"%matlab\EXTERN\LIB\WIN32\MICROSOFT"。这里%matlab是matlab的安装路径,library files项要根据系统平台及c语言的开发环境来选择。这个设置跟前面matlab编译器的设置一样,只需要设一次就可以了,建立其它的工程时不用现进行设置。
然后可以开始编程了。这里选用MFC编程。先建立一个基于对话框的工程,接受所有黑夜默认的设置。完成后,将前面编译生成的.ctf,.dll和.lib文件复制到当前工程路径下。
对生成的对话框做一些改动,去掉自动生成的“确定”及取消“按钮”及文本(如果你想留着也没关系啦),添加"Plot"及"Close"按钮,并添加其响应函数(双击按钮就会生成的)。
在myplotDlg.cpp文件里添加:
#include myplot.h
在OnInitDialog函数里添加如下:
// Initialize the MCR
if (!mclInitializeApplication(NULL,0))
{
AfxMessageBox(_T("Could not intialize the application."));
return TRUE;
}
// Initialize the matlab library
libmyplotInitialize();
在Plot按钮的响应函数中,添加:
myplot();
在Close按钮的响应函数中,添加:
// Terminate the library
libmyplotTerminate();
// Terminate the MCR
mclTerminateApplication();
OnClose();
程序的编写到这里就OK啦。然后要设置连接选项了。
Project\settings\category选择Input,在Object/Library modules添加libmyplot.lib mclmcrrt.lib,对Win32 Release和Win32 Debug都进行相同的设置。
这样的Over了,编译,链接,运行,就可以看到结果了。不过估计是因为要启动MCR吧,程序的启动会很慢,耐心等待哦。
最后说一下关于程序的发布问题。之所以进行混合编程,一个很重要的原因就是想让一些matlab函数可以脱离matlab平台运行,为了达到这一目的,在发布程序时,除了发布C生成的可执行文件及matlab编译生成的.ctf,.dll和.lib文件外,还应该同时发布一个MCRInstaller以便没有matlab平台的用户使用。MCRInstaller的生成方法很简单,使用下面的函数即可:
zipfile = buildmcr(dirname)
该函数将生成MCRInstaller.zip文件,并将该文件保存到dirname指定的路径下,zipfile返回的是完整的路径名。
这样就可以发布程序了。没有matlab平台的用户在使用时,应该先将MCRInstaller.zip解压到本地的某一路径下,并将其中的可执行文件所在的路径(应该是在bin文件夹底下)添加到系统环境变量中。
Note:添加系统环境变量的方法
在我的电脑上右键,选择属性,再选择高级子菜单,点击环境变量按钮,并点击弹出对话框中系统变量对应的新建按钮,变量名可以自定义,变量值就是前面得到的路径。
这样就彻底地结束了,不过我没有在没有matlab平台的电脑上测试过,哪位测试过的告诉我一下结果。