常用数学软件选讲2VC与Matlab接口编程如果在C\C++语言中能用MATLAB那么简单的代码来实现该功能就可以大大减少工作量,VC和MATLAB接口就是做这个工作的。利用MATLAB的编译工具将m文件方便的转化为C\C++语言、可执行程序(exe)、动态连接库文件(dll)、COM组件等等,并可直接供C\C++语言调用,利用VC和MATLAB接口技术可以在VC中充分发挥MATLAB的数值计算功能,并且可以不依赖MATLAB软件运行。我们在编写程序时,可以在VC下做出很漂亮的界面,而把复杂的数值处理交给MATLAB去做(实际上MATLAB也能做界面GUI(GraphicUserInterface),而且做出的界面并不比VC逊色,但是需要MATLAB软件作为后台运行,如果不依赖MATLAB软件运行的话,可以在VC中调用GUI),然后通过接口技术将MATLAB集成到VC中,这样可以大大减轻编程的负担,并减少程序编写时间。3VC与Matlab接口编程MatlabEngine方式MatlabC\C++函数库(7.0后不建议使用,略)Matlab自带的MatlabCompilerMatcom技术COM组件接口方法(VisualC++6.0Matlab6.5)4MatlabEngine方式MatlabEngine是指一组Matlab提供的接口函数,支持C语言,MatlabEngine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向MatlabEngine传递命令和数据信息,从MatlabEngine接受数据信息。用户可以在前台应用程序中调用这些接口函数,实现对MatlabEngine的控制。采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,适合个人使用或做演示用。5Matlab自带的MatlabCompilerMatlabCompiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令),这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。到matlabR12.1为止,MatlabCompiler的m程序转换成C/C++代码功能有很多限制:1.不能转换脚本m文件,只能转换m函数;2.不能使用matlab对象;3.不能用input或者eval操作matlab空间变量;4.不能动态地命名变量,然后用load或者save命令来操作;5.不能处理具有嵌套调用其他m文件的m文件;6.不能使用MATLAB内联函数;61、必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex-setup和mbuild-setup两个命令对编译器进行配置,如果以前已经进行了配置就不需要这一步。动态链接库方式7mbuild-setup892、设置头文件和库文件的路径,配置完成如图1和图2103、在MATLAB打开文本编辑器(File-New-M-file)写一个简单的m函数:functiony=huatu_test()x=-10:0.1:10;y=sin(x);plot(x,y,''*'')文件保存为huatu_test.m。4、在MATLAB命令窗口用如下命令生成dll文件和调用dll所需要的文件:mcc-t-Wlibhg:dlltest-Tlink:lib-hlibmmfile.mlibhuatu_test.m生成的文件将会保存在当前目录下,默认的当前目录为:MATLAB根目录\work,找到dlltest.h、dlltest.lib和dlltest.dll文件,这三个文件是我们需要的。5、在VC中新建一个名为ceshi基于对话框的工程,在工程中添加一个名为测试的button按钮。将dlltest.h、dlltest.lib和dlltest.dll文件拷贝到当前工程目录下,并通过Project-AddToProject-Files选择拷贝到当前目录下的三个文件,将文件引入工程。116、在ceshiDlg.cpp文件中添加头文件dlltest.h#includedlltest.h打开dlltest.h文件,里面有有关函数的定义,找到其中三个函数:externmxArray*mlfHuatu_test(void);externvoiddlltestInitialize(void);externvoiddlltestTerminate(void);从函数意思不难知道它们的作用,dlltestInitialize用来初始化dll库,dlltestTerminate用来结束调用dll,mlfHuatu_test为主程序执行函数。将三个函数拷贝到button响应代码中,进行修改:voidCCeshiDlg::OnButton1(){dlltestInitialize();mlfHuatu_test();dlltestTerminate();}12编译、执行程序,点击结果如图13可以看出,相比VC编写dll文件,利用MATLAB编译器生成dll文件,以及在VC中调用该dll文件要方便和简单的多。利用编译器还可以根据需要生成C\C++源文件,可执行文件等。MATLAB6.5的编译器为3.0版本,MATLAB7.0的编译器为4.0版本,4.0版本的编译器对原编译器进行了很多改进,3.0很多方法都不再使用,上述方法如果在7.0版本上使用会出现错误。利用mcc命令,通过不同的参数设置可以生成不同的文件,例如:mcc-Bsglmyfun将myfun.m文件生成对应的c文件和使用c图形库的可执行程序mcc-Bsglcppmyfun将myfun.m文件生成相应的c++文件和使用c++图形库的可执行程序(如果自己编写的程序图形不能显示菜单栏和工具栏,拷贝文件夹bin到当前目录下)14利用编译器将m文件转换成对应的C\C++文件,并在VC中调用首先要保证编译器设置正确,编译器的设置可以参考前面两节的内容。如果以前已经进行了配置就不需要这一步。1、在MATLAB中编写如下函数:function[x]=gjfcz(A,b)%A=[-1.512;423;-328]%b=[3;5;6]x=A\b保存名为gjfcz.m,该函数的功能为求解线形方程组。2、在MATLAB的命令窗口输入以下命令:mcc-mgjfcz.m该命令用来生成对应的C文件和可执行程序。在MATLAB工作目录下(一般是MATLAB\work)将会生成如下文件:gjfcz.exe,gjfcz.c,gjfcz.h,gjfcz_main.c,其中gjfcz.c,gjfcz.h是我们需要的文件。15Matcom简介这是个第三方控件,很小(8M多),原本属于mathtool公司,后来被Mathworks公司合并了,使用该工具可以将m脚本文件和m函数转化成相同功能的C\C++文件,相比其它方法使用matcom具有如下优点:1.转换过程简单(由matcom工具自动实现),容易实现;2.可以方便的生成动态链接库文件(dll)和可执行文件(exe);3.不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;4.设置环境后,可以使用Matlab的工具箱函数;但matcom也有以下不足:1.对struct等类的支持有缺陷,对class数据类型;2.部分绘图语句无法实现或得不到准确图象,尤其是三维图象;16相比Matlab自带的编译器Compiler,用Matcom转化代码要简单和方便得多。本节将以VC6.0和Matcom为例,详细介绍如何利用Matcom进行VC与Matlab的联合编程。Matcom简介17Matcom安装安装Matcom前要已求安装VC6.0。Matcom可以独立于Matlab运行,但需要外部的C++编译器,在安装时指定Matlab的位置是为了让编译文件中需要的一些系统函数找到路径。18安装完成后,启动界面MIDEVA(下图)。MIDEVA集成开发环境包括命令行窗口、变量列表窗口、命令列表窗口和编译链接信息窗口等几部分,并有详细的帮助文档19Matcom命令输入方法与Matlab相同。如果安装在中文版操作系统时,输入命令前加一空格。(下图)20m文件编译后放入VC中1、启动MIDEVA,File-New,新建如下Test1.m文件:x=1:0.1:10;y=sin(x);plot(x,y);将文件保存(如下图)。m文件保存的默认位置为:matcom安装目录\matcom45,生成的C++文件保存的默认位置为:matcom安装目录\matcom45\Debug\,本例matcom安装目录为C盘即C:\matcom45\Debug\,在该目录下将会产生Test1.h、Test1.cpp、Test1.r、Test1.obj文件。212、在VC中用MFCWizard(exe)创建一个基于对话框名为Example的工程。在面板上添加一个ID为IDC_BUTTON1按扭。3、将C:\matcom45\Debug目录下的Test1.cpp文件的内容拷贝到voidCExamleDlg::OnButton1()下224、将C:\matcom45\lib\下的matlib.h和v4501v.lib文件和C:\matcom45\debug下的Test1.h文件拷贝到工程Example目录下,然后在VC中将库文件和头文件加入到工程中:工程-添加工程-Files,选择刚刚拷贝到Example目录下的matlib.h、v4501v.lib和Test1.h文件235、在ExamleDlg.cpp中加入如下代码:#includematlib.h#includeTest1.h6、在voidCExamleDlg::OnButton1()中分别添加一个初始化类库调用函数”initM(MATCOM_VERSION)”和一个结束类库调用函数”exitM()”24运行程序,点击画图按扭程序的release版本需要ago4501.dll、v4501v.dll、v4501.lib三个文件的支持。25在VC中调用matcom编译后的函数首先新建一个函数huatu.m,该函数的功能是:接受用户输入的左端点值和右端点值两个输入参数,然后在该区间画正弦图形。函数还将生成两个随机数,作为一个点的坐标在图中打印出来(绿点),用来说明如何在VC中处理调用函数的返回值。261.建立一个名为Example2基于对话框的MFC(exe)工程。2.在matcom中新建一个名为huatu.m文件273.在matcom命令窗口中运行该函数284.将生成的huatu.h、huatu.cpp(默认位置为安装目录:\matcom45\samples\Debug)和matlib.h、v4501v.lib(默认位置为安装目录:\matcom45\lib)四个文件拷贝到建立的工程Example2目录下。5.将第四步拷贝的四个文件加入到VC工程中:工程-添加工程-文件,选择刚才拷贝到Example2目录下的四个文件。完成后如图296.在Example2dlg.cpp中添加头文件:#includematlib.h#includehuatu.h307.为工程建立界面:添加一个Button按扭控件;添加四个Editbox控件,用于显示数据;添加五个Statictext控件,四个显示文字,一个显示图形,将显示图形的Statictext的ID设置为ID_PIC。其他所有控件属性保持默认318.按Ctrl+W为控件添加变量。329.为Button1按钮添加响应代码。3310.运行程序,输入左端点和右端点,点击”画图”按钮,结果如图34注:如果在编译中出现下列错误:fa