VC++中使用MATLAB的C++数学库和MCC生成的程序(转)

来源:互联网 发布:淘宝的苏宁易购旗舰店 编辑:程序博客网 时间:2024/05/16 08:40
 
VC++中使用MATLAB的C++数学库和MCC生成的程序(转)
2007-09-01 23:34

引言

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 ApplicationIgnore 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。