引言
Visual C++ 是由 Microsoft 公司推出的可视化编程语言,它是目前综合性最高、最强大、也是最难学的软件开发工具之一,应用极为广泛。Matlab是Mathwork公司推出的一种高性能的数值计算和和可视化软件, 其全称为Matrix Laboratory,亦称矩阵实验室,它在数值分析、信号处理、系统辨识、特殊函数和图形等方面具有广泛的应用。MATLAB的突出特点是简洁,它利用丰富的函数资源,给用户带来最直观的开发环境。
由上可见,如果我们能够把 Matlab与Visual C++很好地结合起来,那将大大地提高编程者的工作效率。本文就是与大家来共同探讨这一问题。
MATLAB5.3的提供了C/C++数学库,其中的C++数学库功能很强,使用它可以用类似MATLAB的语法编写C++程序,十分方便。虽然速度上仍然比手工C/C++程序慢,但是由此换来的高效的开发效率和可靠性往往是值得的。另外mcc命令可以将M文件转化为C或CPP文件,编译后可以脱离MATLAB运行,它们也是使用的C/C++数学库。
不过,MATLAB的数学库在开发时似乎倾向于编译独立的可执行程序,把VC、BC只是作为一个编译和连接的工具,而没有过多地考虑在VC、BC的集成环境下进行开发。这给我们带来了不便。
一、MATLAB中的操作
(一)配置MATLAB
用如下命令:
mex –setup
mbuild -setup
(二)数据处理函数
1、没有使用图形相关的函数
由于MATLAB的编译器只能对函数m文件进行编译,所以如果原来的程序是脚本程序应改写成函数形式。举例如下:
建立一个m文件test1.m,内容如下:
function y = test1(n)
y = 1 ;
for i = 1 : n
y = y * i ;
end
用如下命令对其进行编译:”
mcc -t -L Cpp test1
如果程序由多个m文件组成,在编译命令中只需要指定主文件即可,mcc会自动查找相应的m文件进行编译;编译完成后会得到与m文件名相对应hpp和cpp文件,拷到我们建立的VC工程中去。
(三)使用了图形相关的函数
建立一个m文件test2.m,内容如下:
function test2
plot(rand(10));
用如下命令编译:
mcc –p –B sglcpp test2
如果程序由多个文件组成,处理方法同上;编译完成后得到与m文件名相对应的hpp和cpp文件、一个主函数文件、bin目录中的两个Fig文件以及一个exe文件。我们需要的只是与m文件相对应的hpp文件、cpp文件以及bin目录中的两个fig文件,本例中是test2.hpp,test2.cpp以及bin目录(FigureMenuBar.fig和FigureToolBar.fig)拷到我们建立的VC工程中去。
二、VC中的操作
(一)操作说明:
1. 用VC建立MFC Appwizard(exe) (Dialog Based)的工程,把MATLAB中的操作中提到的源程序拷贝到工程所在目录中。
2. 菜单Project-Add To Project-Files把所有拷贝过来的cpp文件加入到当前工程中。
3. 选择菜单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
4. 选择菜单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文本框,这里需要根据不同的工程类型进行填写。
MFC Appwizard(exe) (Dialog Based)的Ignore Libraries里加入msvcrt.lib。
Win32 Console Application的Ignore Libraries里加入msvcrt.lib,由于MATLAB的库函数与VC的输入输出函数cout、cin、cerr冲突,所以需要把MFC生成的下面一行代码删掉,并且在以后的代码中页不能有cout、cin、cerr。
cerr << _T("Fatal Error: MFC initialization failed") << endl;
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即可去除该信息。
5. 选择C/C++属性页,在下拉列表中选择Preprocessor,在Preprocessor definitions中加入MSVC,IBMPC,MSWIND
再在下拉框中选择Precomplied Headers,选中Automatic use of precompiled headers,在其中填入stdafx.h 。
(二)MFC Appwizard(exe)类型的工程具体说明
以带图形函数的为例,把test2.hpp和test2.cpp以及只包括两个fig文件的bin目录拷贝到当前工程中;在主对话框上添加一个Button,并添加按钮的相应函数OnButton1。
1、在按钮响应函数所在文件中添加头文件代码:#include "test2.hpp"
2、在按钮相应函数中添加代码:test2();
3、在对话框类的OnInitDialog函数中添加如下代码:
libmmfileInitialize();
libmwsglmInitialize();
mlfHGInitialize(NULL,NULL);
4、在对话框的消息WM_DESTROY的处理函数OnDestroy(需要自己添加)中加入如下代码:
mlfHGTerminate();
libmmfileTerminate();
libmwsglmTerminate();
此时即可以编译成功了。
在VC++程序中直接引用MATLAB的函数是方便的,只要把matlab.hpp作为头文件include一下就可以了,如fft,fft2,ifft,ifft2,lu,svd等等都可以直接使用,MATLAB提供几百个常用的函数,其引用格式也和MATLAB的语法没有大的区别。
在MATLAB中输入和输出变量都是mwArray类型的,所以在引用是需用mwArray来定义输入和输出变量。
我们知道在c语言中一个函数只能返回一个值或一组值(利用数组或指针来实现),而在MATLAB中允许[A,B]=func(C,D)这样来返回多组值,这样就在VC中引起冲突,采用A=func(&B,C,D)格式就可解决这个问题,这样就可以在VC中实现返回多组数值,其中A是第一组返回的数值,B是第二组返回的值,C,D是两个输入数组变量。其他返回三个或更多个变量的情况类推。
MATLAB中数组的下标是从1开始的,引用是使用()符号,而在VC++中数组下标是从0开始的,而且引用使用[]符号。即在VC++中引用mwArray定义的数组时,方法和在MATLAB中引用没什么区别。
四、程序的发布
由于程序中调用了MATLAB数学函数库或图形库中的函数,所以需要附带MATLAB的这些函数库才能在没有安装MATLAB的机器上运行。幸好MATLAB已经把这两个库的函数打包了,这样就省得我们一个一个去搜集了。该文件就是位于matlab安装目录中extern/lib/win32子目录中的mglarchive.exe。运行该程序即可自动把需要的库函数解压到当前目录中,把编译好的程序放到该目录中拷贝到未装matlab的机器上即可实现脱离matlab。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sworder_001/archive/2006/12/11/1438918.aspx