`

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

阅读更多


引言

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/skytosky/archive/2007/09/19/1791451.aspx
分享到:
评论

相关推荐

    VC++中使用MATLAB的C++数学库和MCC生成的程序.txt

    在VC++中使用MATLAB的C++数学库和MCC生成的程序,不仅拓展了MATLAB的应用范围,还提高了跨平台部署的灵活性。通过细致的配置和代码实现,可以充分利用MATLAB的数学优势,同时享受C++的高效性能,为复杂计算任务的...

    VC++中使用MATLAB的C++数学库

    【VC++中使用MATLAB的C++数学库】 在计算机科学和工程领域,MATLAB是一种强大的数值计算和可视化工具,而Visual C++(VC++)则是一款由Microsoft开发的广泛应用于软件开发的集成开发环境(IDE)。将两者结合,...

    VC_MATLAB.rar_MCC_VC_matlab vc_vc matlab

    文件"VC++中使用MATLAB的C++数学库和MCC生成的程序.txt"很可能包含了详细的步骤和示例代码,指导用户如何在VC++中成功集成MATLAB的C++接口和MCC编译的代码。这可能包括了如何设置项目属性、如何组织源码结构、如何...

    (综述)vc++中调用matlab函数的方法_vc++中调用matlab函数的方法_

    在VC++中调用MATLAB函数,通常是为了利用MATLAB强大的数学计算能力,而避免重复编写复杂的数值处理代码。本文将详细介绍如何通过MATLAB Compiler将MATLAB脚本或函数转换为可由VC++调用的动态链接库(DLL)。 首先,你...

    VC++和matlab混合编程实例

    5. **编译和链接C++项目**:使用VC++或其他C++编译器,将C++源码与MATLAB库文件链接起来,生成最终的可执行程序。确保设置正确的链接器选项,指向MATLAB的库路径。 6. **运行和测试**:运行编译后的C++程序,通过...

    个人编写的VC++调用Matlab生成的DLL源程序

    在本项目中,标题"个人编写的VC++调用Matlab生成的DLL源程序"揭示了一个集成开发环境(IDE)的使用,即Visual C++(VC++),与数学计算软件Matlab之间的协同工作。开发者利用Matlab生成动态链接库(DLL),然后在...

    在VC++中调用MATLAB_混合编程的方法

    1. **使用MATLAB的C++数学库和mcc生成的程序** - **实现方式**:通过将MATLAB的.m文件转换为C++代码,然后在VC++中直接调用这些代码。这通常需要使用MATLAB自带的编译器mcc,该工具能够将MATLAB脚本转换为C++代码。...

    利用VC_调用MATLAB数学库和图形库的方法

    C++数学库中的核心数据结构包括`mxArray`、`mxClassID`和`mxArrayPtr`等,这些数据结构为用户提供了一种简洁且高效的编程接口,使用户能够在C++环境中轻松地访问MATLAB的强大功能。 #### 调用MATLAB数学库和图形库...

    VC 调用MatLab数学库接口设计.pdf

    【VC++调用MatLab数学库接口设计】 MatLab是一款强大的数学计算和信号处理软件,其丰富的函数库和直观的编程环境深受科研人员和工程师喜爱。然而,由于MatLab对计算机配置的要求较高,且其解释性语言在工程应用中...

    关于VC++和MATLAB的混合编程之神经网络工具箱

    MATLAB还提供了一种直接调用C/C++数学库的方式,这种方式允许开发者使用C/C++语言编写代码并直接调用MATLAB提供的数学库。这种方式的优点在于: - **灵活性**:开发者可以直接使用C/C++语言的优势,如性能优化等。 -...

    在VC_中调用MATLAB混合编程的方法

    使用MATLAB C/C++数学库和mcc生成的程序 这种方法允许用户直接在VC++中调用MATLAB提供的数学库函数,或者使用MATLAB自带的mcc编译器将MATLAB脚本转换为C/C++代码。这样不仅可以避免启动MATLAB环境带来的开销,还...

    MATLAB与VC++接口技术的实现方法

    6. 利用MCC命令生成包裹文件:MATLAB的MCC命令能够生成与MATLAB文件对应的C语言或C++语言的包裹文件,这些文件可以在VC++环境中使用。这个方法通常用于创建独立的可执行文件。 在这六种方法中,使用Matcom将MATLAB...

    MAtlab7.1与VC++6.0 混合编程,MATLAB中dll制作-VC6中调用,非常好

    在C++代码中,必须注意初始化MATLAB库和自定义库。例如,使用`mclInitializeApplication`和`libDotMulInitialize`函数。同时,使用`mwArray`对象来传递数据,因为MATLAB和C++的数据类型不兼容,`mwArray`作为接口能...

    生物数学matlab中mcc和mex等编译命令.pdf

    总结起来,`mcc`、`mbuild`和`mex`是MATLAB中用于代码编译和封装的关键工具,它们帮助MATLAB用户将脚本转化为可以在不同环境下运行的程序,或者构建与MATLAB紧密集成的扩展功能。了解和掌握这些命令的使用,能够极大...

    VC++6.0与MATLAB R2010a混合编程实例.doc

    通过上述步骤,可以实现在VC++6.0中调用由MATLAB R2010a编译生成的动态链接库,完成两者的混合编程。这种方法不仅能够充分利用MATLAB的强大计算功能,还能发挥VC++在用户界面设计和系统资源管理上的优势。

    Matlab-CC--函数库介绍及应用举例.docx

    这些接口函数可以在 VC++ 中调用 Matlab 数学和图形库,生成运行时不需 Matlab 支持的应用程序。 Matlab-CC 函数库是一个强大的工具,能够将 Matlab 的高效算法带入到 C++ 应用程序中,提高软件开发效率和算法的...

    vc++与matlab混合编程的快速实现

    在本主题中,我们将探讨如何快速实现VC++(Visual C++)与MATLAB的混合编程,这将使我们能够利用VC++的高效执行能力和MATLAB的强大数学计算能力。 VC++是一种由微软开发的面向对象的C++编程环境,它提供了丰富的库...

    VC++与Matlab混合编程的快速实现

    1. **编译*.m文件**:在Matlab中使用命令`mcc -m -B sgl calculateArea.m`编译这个文件。 2. **添加到VC++项目**:在VC++中创建一个新的项目,并将生成的`calculateArea.dll`及其头文件添加到项目中。 3. **调用DLL...

Global site tag (gtag.js) - Google Analytics