引言
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
发表评论
-
Windows消息机制要点
2011-02-13 17:13 7321. 窗口过程 每个窗口 ... -
Windows的消息机制
2011-02-13 11:33 1684Windows是一个消息(Messag ... -
许多VC++/MFC构架的开源项目
2011-02-09 16:14 1124... -
最好的53个 VC++ /MFC 开源软件项目
2010-12-14 17:51 1552http://www.codeproject.com/KB/c ... -
Matlab与VC混合编程
2010-10-19 23:32 975众所周知,MATLAB是一套功能非常强大的商业数学软件,从信 ... -
VC中如何调用DLL中的函数
2010-10-18 15:03 1095调用DLL有两种方法:静态调用和动态调用. (一).静态调用其 ... -
dll #pragma data_seg 实现数据的共享
2010-10-18 00:52 1446#pragma data_seg("flag_dat ... -
(zz)Vs 2008 解决方案的目录结构设置和管理
2010-10-13 19:20 1222解决方案与项目: 从V ... -
(zz)MFC 入门必读
2010-10-13 13:00 4246以下是很多VC爱好者的 ... -
(zz) VC项目配置基础
2010-10-13 12:48 1364一.预处理宏 1. 通用宏 VC6.0中: ... -
(zz)VS2008在win7下不时出现Microsoft Incremental Linker已停止工作
2010-10-06 21:48 2400/INCREMENTAL 选项控制链接器如何处理增量链接。 ... -
error LNK2001: unresolved external symbol VC++链接错误详解
2010-10-04 03:40 5875学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌 ... -
error LNK2001: unresolved external symbol _main解决办法(zz)
2010-09-27 04:52 880error LNK2001: unresolved exter ...
相关推荐
在VC++中使用MATLAB的C++数学库和MCC生成的程序,不仅拓展了MATLAB的应用范围,还提高了跨平台部署的灵活性。通过细致的配置和代码实现,可以充分利用MATLAB的数学优势,同时享受C++的高效性能,为复杂计算任务的...
【VC++中使用MATLAB的C++数学库】 在计算机科学和工程领域,MATLAB是一种强大的数值计算和可视化工具,而Visual C++(VC++)则是一款由Microsoft开发的广泛应用于软件开发的集成开发环境(IDE)。将两者结合,...
文件"VC++中使用MATLAB的C++数学库和MCC生成的程序.txt"很可能包含了详细的步骤和示例代码,指导用户如何在VC++中成功集成MATLAB的C++接口和MCC编译的代码。这可能包括了如何设置项目属性、如何组织源码结构、如何...
在VC++中调用MATLAB函数,通常是为了利用MATLAB强大的数学计算能力,而避免重复编写复杂的数值处理代码。本文将详细介绍如何通过MATLAB Compiler将MATLAB脚本或函数转换为可由VC++调用的动态链接库(DLL)。 首先,你...
5. **编译和链接C++项目**:使用VC++或其他C++编译器,将C++源码与MATLAB库文件链接起来,生成最终的可执行程序。确保设置正确的链接器选项,指向MATLAB的库路径。 6. **运行和测试**:运行编译后的C++程序,通过...
在本项目中,标题"个人编写的VC++调用Matlab生成的DLL源程序"揭示了一个集成开发环境(IDE)的使用,即Visual C++(VC++),与数学计算软件Matlab之间的协同工作。开发者利用Matlab生成动态链接库(DLL),然后在...
1. **使用MATLAB的C++数学库和mcc生成的程序** - **实现方式**:通过将MATLAB的.m文件转换为C++代码,然后在VC++中直接调用这些代码。这通常需要使用MATLAB自带的编译器mcc,该工具能够将MATLAB脚本转换为C++代码。...
C++数学库中的核心数据结构包括`mxArray`、`mxClassID`和`mxArrayPtr`等,这些数据结构为用户提供了一种简洁且高效的编程接口,使用户能够在C++环境中轻松地访问MATLAB的强大功能。 #### 调用MATLAB数学库和图形库...
【VC++调用MatLab数学库接口设计】 MatLab是一款强大的数学计算和信号处理软件,其丰富的函数库和直观的编程环境深受科研人员和工程师喜爱。然而,由于MatLab对计算机配置的要求较高,且其解释性语言在工程应用中...
MATLAB还提供了一种直接调用C/C++数学库的方式,这种方式允许开发者使用C/C++语言编写代码并直接调用MATLAB提供的数学库。这种方式的优点在于: - **灵活性**:开发者可以直接使用C/C++语言的优势,如性能优化等。 -...
使用MATLAB C/C++数学库和mcc生成的程序 这种方法允许用户直接在VC++中调用MATLAB提供的数学库函数,或者使用MATLAB自带的mcc编译器将MATLAB脚本转换为C/C++代码。这样不仅可以避免启动MATLAB环境带来的开销,还...
6. 利用MCC命令生成包裹文件:MATLAB的MCC命令能够生成与MATLAB文件对应的C语言或C++语言的包裹文件,这些文件可以在VC++环境中使用。这个方法通常用于创建独立的可执行文件。 在这六种方法中,使用Matcom将MATLAB...
在C++代码中,必须注意初始化MATLAB库和自定义库。例如,使用`mclInitializeApplication`和`libDotMulInitialize`函数。同时,使用`mwArray`对象来传递数据,因为MATLAB和C++的数据类型不兼容,`mwArray`作为接口能...
总结起来,`mcc`、`mbuild`和`mex`是MATLAB中用于代码编译和封装的关键工具,它们帮助MATLAB用户将脚本转化为可以在不同环境下运行的程序,或者构建与MATLAB紧密集成的扩展功能。了解和掌握这些命令的使用,能够极大...
通过上述步骤,可以实现在VC++6.0中调用由MATLAB R2010a编译生成的动态链接库,完成两者的混合编程。这种方法不仅能够充分利用MATLAB的强大计算功能,还能发挥VC++在用户界面设计和系统资源管理上的优势。
这些接口函数可以在 VC++ 中调用 Matlab 数学和图形库,生成运行时不需 Matlab 支持的应用程序。 Matlab-CC 函数库是一个强大的工具,能够将 Matlab 的高效算法带入到 C++ 应用程序中,提高软件开发效率和算法的...
在本主题中,我们将探讨如何快速实现VC++(Visual C++)与MATLAB的混合编程,这将使我们能够利用VC++的高效执行能力和MATLAB的强大数学计算能力。 VC++是一种由微软开发的面向对象的C++编程环境,它提供了丰富的库...
1. **编译*.m文件**:在Matlab中使用命令`mcc -m -B sgl calculateArea.m`编译这个文件。 2. **添加到VC++项目**:在VC++中创建一个新的项目,并将生成的`calculateArea.dll`及其头文件添加到项目中。 3. **调用DLL...