VC++中如何调用matlab函数

合集下载

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

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

 Ξ 收稿日期:2009-07-09

作者简介:

景(1981—),男,河北石家庄人,硕士研究生,主要从事计算机软件与理论研究.

在VC++中调用MAT LAB混合编程的方法Ξ

(军械工程学院计算机工程系,石家庄 050003)

摘要:介绍了在VC++调用Matlab的几种常用方法及各自特点,并结合实例重点说明了在VC++中通过C OM组件调用Matlab的具体实现过程.

关键词:M AT LAB;VC++;Matcom;C OM

中图分类号:TP311.1文献标识码:A文章编号:1006-0707(2009)10-0136-02

Matlab是美国Math W orks公司推出的一套数值计算软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干个领域的计算和图形处理功能.Matlab以矩阵作为基本数据结构,非常适合大规模的数值计算.但是,Matlab是解释性语言,对命令是边解释边执行的,因而其执行的速度比较慢,特别是进行循环计算时,如果执行多次嵌套,则其执行速度会更慢;C++则是编译性语言,一经编译通过后,将以二进制代码方式执行,因而其执行速度非常快,特别在进行多层次嵌套循环运算时,就更能体现其优势;而Visual C++开发软件则是可视化的,其又与Windows操作系统同出自M icros oft公司,故其在应用软件开发平台上具有得天独厚的优势.虽然如此,Matlab中许多复杂的数值计算在Visual C++中却很难实现,比如在Visual C++中用C++语言实现小波运算或高阶统计量运算,要用多少行代码很难想象.因此,若能把Matlab和Visual C++有机地结合起来,就能很好地发挥他们各自的优势,快速地开发出数学计算专业软件[1-7].

vs调用matlab完整步骤

vs调用matlab完整步骤

vs调⽤matlab完整步骤

1.安装TDM-GCC-64 配置好环境变量

2.使⽤matlab安装包,安装Microsoft Windows SDK以Matlab Compiler

3.在matlab中使⽤ mex -setup 以及mbuild -setup配置好编译器环境

4. 执⾏语句:“setenv('MW_MINGW64_LOC','C:\TDM-GCC-64') mcc -W cpplib:xxxlib名 -T link:lib matlab函数⽂件名.m“ ⽣成 xxx.h xxx.dll 和xxx.lib三个⽂件

5.将上述三个⽂件放到vs⼯程中(注意⽤x64环境)

6.vs配置:VC++⽬录包含⽬录R2019b\extern\include

库⽬录extern\lib\win64\microsoft

链接器输⼊→附加依赖项 xxx.lib libmx.lib ibmat.lib mclmcr.lib mclmcrrt.lib

7.包含.h头⽂件,依次调⽤mclInitializeApplication()

...Initialize()

此处可以调⽤matlab⾥的函数,若有参数,参数定义为mwArray a,a可以矩阵、字符串

最后调⽤(可⽆)

mclWaitForFiguresToDie(NULL);

....Terminate();

mclTerminateApplication();

vc++中调用matlab函数的方法:COM组件

vc++中调用matlab函数的方法:COM组件

在利用vc++编程时,常需要一些特殊的数学函数,因此可以调用matlab中的强大的数学函数,通常使用的方法有引擎和com方法。下面对此两种方法进行简单介绍。

1。引擎,

如何设置?

matlab安装在c:\matlab6p5

操作系统:windows2000

(1)在vc中把“工具”-〉“选择”菜单中的“目录”选项卡中设置好

include(C:\MATLAB6P5\EXTERN\INCLUDE),

executable files(c:\matlab6p5\bin\win32)和

library(C:\MATLAB6P5\EXTERN\LIB\WIN32\MICROSOFT\MSVC60)目录,包括进来上面这两个目录。

(2)在C:\MATLAB6p5\bin\win32\mexopts下双击msvc60opts.bat和msvc60engmatopts.bat

(3)在vc中把“工程”-〉“设置”选项卡中的Link的“对象/模块库”中再加上以下内容:libeng.lib libmat.lib libmatlb.lib libmatlbmx.lib

libmex.lib libmmfile.lib libmwarpack.lib libmwlapack.lib

libmwmcl.lib libmwrefblas.lib libmwservices.lib libmwsglm.lib

libmx.lib libut.lib mclcommain.lib sgl.lib

(4)最后在编写程序时加入这么一句预编译语句#include

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南

C语言环境中调用Matlab程序指南

甄梓宁

znzhen@

Matlab在计算方面功能强大、编写简单,但是要运行Matlab程序必须装有Matlab并且用户界面也不够完善,因此除了计算的其他部分采用C等更规范完备的语言进行编写是较好的选择。本文就对如何在C程序中调用Matlab程序作说明。

在C程序中调用Matlab程序有两大类方法。第一种是调用Matlab引擎,第二种是将m文件打包成dll文件在C语言环境下调用。前者虽然易于实现,可以实时监控程序的运行,但是独立性差,需要安装完整版Matlab,且每次调用都会启动MATLAB.exe进程;后者则实现复杂,调试麻烦,但只需安装MCR(Matlab Component Runtime),耗费资源较少。关于MCR,请见第四章的说明。至于两种方法需要在C环境中如何配置请见第五章。

而反过来若要在Matlab下调用C程序则一般使用Matlab自带的mex工具,在此不作介绍。

一、调用Matlab引擎

调用Matlab引擎可以在WIN32、MFC中使用,它的原理实际上相当于打开一个精简版的Matlab然后往里面输命令。下面是调用Matlab中的加法程序add.m的例子。

先在Matlab的work目录下创建add.m文件并编写程序如下:

function s = add (a, b)

s = a+b;

在C程序中,首先打开精简版的Matlab:(所需头文件,引用库等见第五章)

Engine *ep = engOpen (NULL);

编译运行后,会自动打开一个命令行监控窗口,输入pwd就可以看到当前的工作目录,于是需要先将工作目录转换至存放add.m的目录:

VC++调用Matlab引擎(engine)配置方法

VC++调用Matlab引擎(engine)配置方法

如何在C/C++语言里调用Matlab引擎(engine)

——(上篇)windows下的Visual C++平台

Windows下调用Matlab引擎要做好以下三点设置

(1)设置头文件目录

(2)设置库文件目录,并添加链接库输入项libeng.lib和libmx.lib

(3)设置环境变量

以下以Visual Studio 2008为例来说明如何设置这三点:

1、添加头文件目录

依次选择:“工具”->“选项”,调出对话框后

再在对话框左边“选择项目和解决方案”->“VC++目录”

然后在右边选择“显示以下内容的目录”下的选框选择“包含文件”,再在目录列表的最下边空行处选中添加:matlab安装目录下的\extern\include路径比如我

的是:C:\Program Files\MATLAB\R2011a\extern\include

如果现在生成项目,链接将不会通过,比如可能会出现:

1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxDestroyArray,该符号在函数_WinMain@16 中被引用

1>engwindemo.obj : error LNK2019: 无法解析的外部符号_mxGetPi,该符号在函数

_WinMain@16 中被引用

1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engClose,该符号在函数

_WinMain@16 中被引用

1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engGetVariable,该符号在函数_WinMain@16 中被引用

VC中使用matlabC++数学函数库

VC中使用matlabC++数学函数库
NLLKOLPOL4 收稿日期:
K ;2*<2= :>>简介 ;2*<2= :>>函数库是由 ;2*<2= 提供的基于 : >>语言的数 学函数库, 是 ;2*<2= 的扩展部分, 其中包含了 MLL 个 ;2*<2= 数学函数,不但包括了大量的内建函数,而且包含了许多 ;2*<2= 中声明的 ; 文件的数学函数。 ;2*<2= 数学函数库的 使用极类似于文件, 但性能有显著提高, 它脱离了解释性环 境,并与 ;2*<2= 可完全脱离,建立自己独立的可执行性 ( /*2)-2<$)&) 程序。 我本人在一些工程计算中曾用到较多的 ;2*<2= 常常成为 算法程序, 但难与 ;2*<2= 的强大功能相比, 我验证程序正确性的一部分。而 ;2*<2= 数学库函数则使我 更添 ;2*<2= 强 如获至宝, 我在使用 ,: >>强大功能的同时, 大的工程计算能力,使我从软件开发中从复杂算法设计中 解脱出来。 另外 ;?@A?B 中的 6FF 命令可以将 ; 文件转化 为 : 或 :## 文件, 编译后可以脱离 ;?@A?B 运行, 它们也 是使用的 :S:>>数学库。 ;2*<2= :>>数学函数库的核心是 6%?’’2G 类, 该类包含 了大量与阵列有关操作的构造、 成员、 转换、 内存管理、 赋 框中选取 !视频剪辑 !" 单击 !确定 !" 幻灯片上便增加了一个放 点击 ! 映机形状的图标" 这时 #$%&’#$()* 调出了媒体播放器, 插入剪辑 +,(-&$ .$’ %()-$%/!" 将对话框中 !文件类型 ! 中的 ,(-&$ .$’ %()-$%/ ! 影片文 ( 0123()换成 ! 所有文件 ( 010) ( 件,包括一些动画软件如 45627 作出的文件有 23( 和 689 两种类型) 。选好影片后, 放映机图表就变成了播放窗口, 单击播放按钮, 影片就开始播放了。 只要在播放窗口外的任 意处单击鼠标就会退出播放, 返回到幻灯片视图中, 注意到 此时影片剪辑窗的下方已被文件名所取代。 有时, 我们只需要调用 ,:5 视盘上影片文件中的某一 段, 而又没有高档的视频编辑机或视频编辑软件, 这时可利 用 %()-$%/ 的强大功能来帮助我们达到这个目的。打开

C或C++调用Matlab程序

C或C++调用Matlab程序

1调用方式

1.将Matlab程序编译为独立可执行文件

可以脱离matlab运行exe程序,但需要MCR运行环境,对于有输入变量的函数而言,执行exe会出错,没什么实用价值

2.C/C++程序调用Matlab引擎

不能脱离matlab使用,实际上主要是用C/C++完成界面编写,通过接口函数调用matlab引擎,C/C++程序向matlab计算引擎传递命令和数据信息,并从matlab计算引擎接收数据信息,相当于在matlab中执行计算程序。

利用计算引擎的特点是:节省大量的系统资源,应用程序整体性能较好,但不能脱离matlab的环境运行,且运行速度较慢,在一些特别的引用(如需要进行三维图形显示)时可考虑使用。

3.C/C++程序调用Matlab程序编译后的动态链接库

可以完全脱离matlab使用,主要思想就是先编译m文件,将函数封装在库文件中,从而可以在C/C++程序中,通过调用DLL实现对matlab代码的调用。

利用mcc编译器生成的DLL动态连接库文件,只需在C/C++编译环境中将其包含进来,调用导出函数即可实现原m文件的功能,极大的方便了用户的代码设计。

4.C/C++程序调用Matlab程序编译后的COM组件

C/C++调用COM组件和调用Matlab程序编译后的动态链接库和的执行效率是相同的,但调用动态链接库实现起来比较简单,调用COM组件实现起来比较复杂,很少使用。

2C/C++调用m文件编译后的动态链接库

2.1Matlab设置步骤

1.命令窗口输入mbuild –setup和mex–setup命令,选择VC++6.0编译器

VC调用Matlab测试

VC调用Matlab测试

1.MCC编译法(EXE)

将matlab的m文件编译成VC++能执行的cpp文件。

1.1编译器安装

>mbuild -setup

选择matlab的默认编译器就可以。

1.2mcc生成exe文件测试

matlab的tt.m文件代码:

t=0:pi/20:2*pi;

[x,y]=meshgrid(t);

subplot(2,2,1);

plot(sin(t),cos(t));

axis equal;

subplot(2,2,2);

z=sin(x)+sin(y);

plot(t,z);

%axis([0 2*pi-2 2]);

subplot(2,2,3);

z=sin(x).*cos(y);

plot(t,z);

%axis([0 2*pi-1 1]);

subplot(2,2,4);

z=(sin(x).^2)-(cos(y).^2);

plot(t,z);

%axis([0 2*pi-1 1]);

生成的图如下所示:

1.3遇到问题

1)利用mcc –m tt.m编译后会生成如下文件:

双击tt.exe会出现黑屏并一闪而过,不方便我们看出错的代码,所以在DOS环境中运行,如下:

解决方法:安装MCRInstaller.exe,我的在G:\Matlab2009a\toolbox\compiler\deploy\win32路径下。

2)消除运行MATLAB生成的exe程序的dos黑屏

基于MATLAB生成exe文件后,每次运行都存在dos黑屏的问题,现在可以通过以下

方法解决:

在matlab命令窗口输入:

cd(prefdir)

edit compopts.bat

C++调用matlab动态库

C++调用matlab动态库

C++调用matlab动态库

环境:Windows 7旗舰版(32位),VS2008,Matlab R2010b

1. matlab中dll创建

1.1 m文件编写

function t = func(file)

t=2;

end

将M文件保存为func.m,保存在d:/test文件夹中。

1.2 设置编译器

在Matlab主窗口中将当前文件夹改为d:/test。为了能够让VC调用Matlab程序,我们可以采用将Matlab程序包装成动态链接文件DLL的形式,然后让VC调用动态链接文件,因此在Matlab中,我们需要设置一下Matlab的编译库,在Matlab主窗口中键入如下代码:mex -setup

然后出现

Please choose your compiler for building external interface (MEX) files:

Would you like mex to locate installed compilers [y]/n?

键入y后回车,出现

Select a compiler:

[1] Lcc-win32 C 2.4.1 in D:\PROGRA~1\Matlab\sys\lcc

[2] Microsoft Visual C++ 2008 SP1 in D:\Program Files\Microsoft Visual Studio 9.0

[0] None

Compiler:

由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现

Please verify your choices:

VC调用matlab的步骤

VC调用matlab的步骤

数据拟合的关键步骤

数据拟合的好坏与模型是否能够成功有很大的关系,因此在数据拟合上,该软件库使用了比较成熟的数据拟合算法,即采用比较权威的高效计算软件Matlab6.1中的数据拟合函数进行拟合。

对于在Visual C++中调用Matlab应用程序接口,关键在于设置编译环境和使用正确的调用规则,然后,在发布软件时携带必要的动态连接库就可以保证程序的独立性[10]。

1、设置Visual C++编译环境

对于调用Matlab的应用程序来说,只要保证程序的编译路径中包含Matlab 的目录下的Extern\Include目录,然后在程序中添加libmx.lib、libmmfile.lib、libmex.lib和libmatlb.lib即可[14]使用Matlab提供的高效算法。而针对于Visual C++6.0来说,具体设置如下:

图3.1 选项目录属性页

第一步:打开应用程序工程后,在‘工具’菜单下选择‘选项’选单,将弹出选项对话框,选择其中的‘目录’属性页,如图3.1所示,在其中的Show

directories for下拉式选

项框中分别选择Include Files和Library Files,在下部的编辑框中输入以下路径:

Matlab根目录\EXTERN\INCLUDE

Matlab根目录\EXTERN\LIB

然后选确定按钮。

第二步:选择下拉菜单Project中的菜单项Add To Project>>Files,将Matlab根目录\\extern\lib\win32\microsoft\msvc60下的四个lib文件:libmx.lib、libmmfile.lib、libmex.lib、libmatlb.lib添加到工程中。完成上述工作后,就可以在Visual C++中调用Matlab数学函数及计算引擎了。

使用VC调用matlab_engine编程

使用VC调用matlab_engine编程

关于如何使用VC调用matlab engine编程

刚开始学使用VC调用matlab engine编程的时候,遇到很多问题,就去百度找解决方法,但发现根本解决不了我的问题,因为网上大部分实例和步骤都是在matlab6.5和vc++6.0环境下完成的,但是现在我用的是matlab2010a,所以会出现很多环境配置的问题,写本文的目的是总结用我在用VC调用matlab engine编程过程中出现的问题和解决办法。

Matlab Engine 采用Client/Server的方式,通过ActivcX通道和Matlab接口来实现在VC编程环境中直接调用matlab中的指令。调用使用的函数是:engEvalSting。

下面是自己的实践过程:

如果是第一次使用,则要设置一下Visual C++6.0 编程环境中的include 和lib的路径指向。我的matlab2010安装在D盘目录D:\MATLAB 2010

一、设置VC相关属性。

(1)Visual C++6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C++6.0设置属性页,进入 Directorie页面,在 Show Directories for 下拉列表中选择Include Files,添加路径:D:\MATLAB 2010\extern\include (这是我电脑中Matlab的安装路径);再选择下拉列表中的 Library Files,添加路径:D:\MATLAB 2010\extern\lib\win32\microsoft(我电脑中Matlab 的安装路径,但是在我查看资料的时候看到很多是

VC中调用matlab配置方法

VC中调用matlab配置方法

ATLAB提供了许多方法与VC程序的通信:MATLAB引擎(ENGINE)模式,采用了客户机/服务器(CLIENT/SERVER)的计算形式,通过MA TLAB应用程序接口(API)中有关函数,在VC 环境中调用MATLAB函数,但此种方法需要MATLAB环境后台支持,因此系统必须安装MATLAB;MA TLAB本身提供的MCC工具编译,编译m文件生成VC++或c语言,直接在VC中使用;MATLAB的MEX工具将m文件编译成DLL,供VC调用。。。。。。MATLAB现具有的MA TLAB Add—in(其包装了MCC、MEX)更方便了第二、三种方法的应用,现本系统的实现就是以第三种为基础的。

2.1 MA TLAB与VC实现互连

为了在开发时实现对MA TLAB的具体功能的调用,应首先在操作系统中安装MATLAB工具软件,之后并运行此工具软件,依次执行“mex –setup;mbuild –setup;cd(prefdir); mccsavepath;”命令。之后运行VC开发工具,从VC++菜单中依次打开“Tools->Customize->Add-ins and Macro Files”,选中MA TLAB Add—in宏,可以看到工具栏中多了一个

。现在VC就可以利用它来得到m文件所对应的c、c++文件。

2.2 开发工具VC运行环境设置

开发时,须对VC的开发环境变量进行设置。通过“Tools->Options->Directories”找到的“Directories”项中添加环境变量。

Matlab程序在VC中的调用

Matlab程序在VC中的调用

Matlab程序在VC中的调用摘要:利用vc与matlab接口技术,用VC 调用Matlab 编译的DLL 文件进行复杂数据处理不仅简洁通用,更具有很强的实用性和可扩展性,在科学计算与工程运用领域具有广泛的推广应用价值。

关键词:MATLAB ;VC;DLL ;接口

1. VC与MATLAB简介

VC 是大家都非常熟悉的一个软件,它是MicroSoft公司开发的在Windows 环境下主要软件开发环境之一,用其中的MFC 可以快速方便地编写出各种友好的用户界面,且用VC ++ 开发的系统具有容易维护升级、界面友好,代码效率高、执行速度快等一系列优点,因此已成为目前应用软件开发中的主流工具之一。

①、MATLAB是Mathworks 公司开发出的一款著名软件,如今已成为世界上使用最广泛的数学软件,它具有强大的数值计算、数据处理、图象显示、符号运算、系统分析、模拟仿真功能,由于受到各个领域专家学者的青睐,在他们的共同努力下,经过多年的发展,如今的Matlab 不仅拥有功能完善的内部函数库,更有专用于各领域的强大工具包,在这个平台上只需寥寥数语便可完成在其它环境中复杂度不可想象的功能;另外,开放性也是Matlab 一个最重要、最受欢迎的特点,除内部函数外,所有Matlab 工具包中主包文件和各工具包文件都是可读可改的源文件,用户可通过对源文件的修改来形

成新的工具包,甚至亦可完全由自己编写源文件来构筑自己研究领域的专用工具包。在欧美发达国家中,Matlab 已经成为应用线性代数、自动控制理论、数理统计、数字信号处理、时间序列分析、动态系统仿真等高级课程的基本教学工具;成为攻读学位的大学生、硕士生、博士生必须掌握的基本技能;在设计研究单位和工业部门,Matlab 也被广泛地用于研究和解决各种具体工程问题。Matlab在中国得到充分的重视,在各科研机构和高校中得到大量的使用。

Vc++6.0调用matlab的数学库函数

Vc++6.0调用matlab的数学库函数

Vc++6.0调用matlab的数学库函数

Vc++6.0调用matlab的数学库函数

前段时间在摸索如何在VC++6.0当中调用Matlab的里的数学库函数。当时弄得我很是郁闷,现在想想,自已走了很多弯路,原来,是如些的简单。所以,与出来和大家一起讨论和分享。

一、关于Matlab6.x

首先,matlab它本身也是用C++语言编写的,具是什么是编译器我倒是忘记了(好像是Borland吧)。说Matlab是一种科学计算语言吧,其实也可以,不过,其实也可以把它看作是一个科学计算软件。它里面有很多的已写好的数值计算、分析以及统计等的函数。然后在Matlab里写文件(比如.m文件),文件里的每一个语句其实都是在调用它里面的函数。说白了,Matlab就是为我们写了一大堆的数学运算函数,然后再能过文档(help指令)来告诉我们怎么调用这些函数,就是这样。

其次,为什么要选择Matlab的6.x版?现在最新的版本好像是7.x 了吧,照理说,就应该用最新版的。可是,最新版的Matlab(7.x)不再把数学库公共了,如果想要调用它里面的函数库,就必须将Matlab在后台运行。也就是说,不管你用什么语言,只要你想调用Matlab7.x里面的函数,那么你的程序就必须在Matlab运行环境下运行。哦,刚才忘记说了,这篇日志的目的是要建立独立于Matlab 运行环境的程序。

最后,Matlab6.x已推出七八年了,会不会和7.x版本相比而有点过时了?我是这样理解的,如果你调用的函数不是一些当前数值计算领域的新兴问题,那就是没有问题的。对于我们工科的人来说,10年前的伟大的mathworks公司绝对可以提供我们想要的计算方法了。所以,6.x,没问题。

vc调用matlab函数

vc调用matlab函数

vc调用matlab函数

时间:2007-09-18作者:佚名编辑:本站点击:3564 [评论]

Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。

但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC++则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提供了更为强大的技术支持。

1、Matlab与VC混合编程的实现方法

Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法:(1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务器的连接,实现动态通信(2)应用Matlab数学函数库,Matlab中包含了内容丰富的函数库,而且还提供了与VC的数学函数接口,用户可以方便的在VC的IDE(集成开发环境)中调用。(3)通过DLL实现VC与Matlab的混合编程。DLL是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供多个应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享[2]。在上述三种方法中,第一种方法对调用Matlab的工具箱很实用,所有在进行控制系统的设计和分析时,一般都是通过调用Matlab 引擎(Engine)来实现的。本文主要介绍采用通过引擎(Engine)来实现VC与Matlab的混合编程。

c++调用matlab函数时,无法解析的外部符号

c++调用matlab函数时,无法解析的外部符号

C++调用Matlab函数时,无法解析的外部符号

今天我们要探讨的主题是C++调用Matlab函数时,无法解析的外部

符号。这个问题在实际的开发中可能会经常遇到,因此我们有必要对

这个问题进行深入的了解和分析。

1. 问题的背景

在实际的软件开发中,有时我们会需要将Matlab中的函数集成到

C++项目中。这样可以充分发挥Matlab的强大数学建模和仿真能力,同时利用C++的高效性能。但是在实际操作中,有时会遇到C++编译器出现无法解析的外部符号的问题。这个问题可能会让开发者感到头疼,因此有必要对其进行深入的分析。

2. 问题分析

C++调用Matlab函数时出现无法解析的外部符号,通常是由于以下

几种情况导致的:

- Matlab编译器无法正确信息Matlab函数的库文件;

- Matlab函数的接口定义与C++调用不匹配;

- 缺少必要的头文件或库文件;

- C++编译器无法正确识别Matlab函数的返回类型或参数类型。

针对以上情况,我们需要逐一进行分析和解决。

3. 解决方案

针对上述问题,我们可以采取以下解决方案:

- 确保Matlab函数的库文件被正确信息。在C++项目中,我们需要在信息器中指定Matlab函数的库文件,以保证函数能够正确被调用和信息。

- 检查Matlab函数的接口定义。确保Matlab函数的输入参数类型、输出参数类型和返回类型与C++调用的要求一致。

- 确保C++项目中包含了Matlab函数的头文件和库文件。这些文件通常包括函数的声明和定义,以及函数所需的依赖库文件。

- 通过extern "C"关键字进行声明。在C++中调用Matlab函数时,需要使用extern "C"关键字进行声明,以避免C++的名字修饰导致无法正确调用Matlab函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Visual C++是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函数库显得不够丰富、读取、显示数据图形不方便。Matlab是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。不过由于Matlab使用的是解释性语言,大大限制了它的执行速度和应用场合。基于VC和Matlab混合编程是很多熟悉VC++编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用Matlab引擎。本文以下部分将详细介绍通过VC++6.0调用Matlab6.5引擎来达到VC++与Matlab数据共享编程的方法。

1. 什么是Matlab引擎

所谓Matlab引擎(engine),是指一组Matlab提供的接口函数,支持C/C++、Fortran等语言,通过这些接口函数,用户可以在其它编程环境中实现对Matlab 的控制。可以主要功能有:

★打开/关闭一个Matlab对话;

★向Matlab环境发送命令字符串;

★从Matlab环境中读取数据;

★向Matlab环境中写入数据。

与其它各种接口相比,引擎所提供的Matlab功能支持是最全面的。通过引擎方式,应用程序会打开一个新的Matlab进程,可以控制它完成任何计算和绘图操作。对所有的数据结构提供100%的支持。同时,引擎方式打开的Matlab 进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制Matlab运行的流程,并可在其中输入任何Matlab命令。

实际上,通过引擎方式建立的对话,是将Matlab以ActiveX控件方式启动的。在Matlab初次安装时,会自动执行一次:

matlab /regserver

将自己在系统的控件库中注册。如果因为特殊原因,无法打开Matlab引擎,可以在Dos命令提示符后执行上述命令,重新注册。

2. 配置编译器(针对Matlab7.0以下版本和XP系统)

要在VC中成功编译Matlab引擎程序,必须包含引擎头文件engine.h并引入Matlab对应的库文件libmx.lib、libmat.lib、libeng.lib。具体的说,打开一个工程后,做如下设置(以VC6为例):

1) 通过菜单工程/选项,打开设置属性页,进入Directories页面,在目录下拉列表框中选择Include files,添加路径:"C:/matlab/extern/include"(假定matlab 安装在C:/matlab目录)。

2) 选择Library files,添加路径:

C:/matlab/extern/lib/win32/microsoft/msvc60。

3) 通过菜单工程/设置,打开工程设置属性页,进入Link页面,在

Object/library modules编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。

以上步骤1)、2)只需设置一次,而步骤3)对每个工程都要单独设定,对于其它C++编译器如Borland C++ Builder,设置大体相同,不再赘述。

3. 引擎API详解

在调用Matlab引擎之前,首先应在相关文件中加入一行:#include "enging.h",该文件包含了引擎API函数的说明和所需数据结构的定义。可以在VC中调用的引擎函数分别如下:

3.1 引擎的打开和关闭

engOpen-打开Matlab engine

函数声明:

Engine *engOpen(const char *startcmd);

参数startcmd是用来启动Matlab引擎的字符串参数,在Windows操作系统中只能为NULL。

函数返回值是一个Engine类型的指针,它是在engine.h中定义的engine 数据结构。

EngClose-关闭Matlab 引擎

函数声明:

int engClose(Engine *ep);

参数ep代表要被关闭的引擎指针。

函数返回值为0表示关闭成功,返回1表示发生错误。

例如,通常用来打开/关闭Matlab引擎的代码如下:

Engine *ep; //定义Matlab引擎指针。

if (!(ep=engOpen(NULL))) //测试是否启动Matlab引擎成功。

{

MessageBox("Can't start Matlab engine!" );

exit(1);

}

. …………

engClose(ep); //关闭Matlab引擎。

3.2 向Matlab发送命令字符串

engEvalString-发送命令让Matlab执行。

函数声明:

int engEvalString(Engine *ep, Const char *string);

参数ep为函数engOpen返回的引擎指针,字符串string为要matlab执行的命令。

函数返回值为0表示成功执行,返回1说明执行失败(如命令不能被Matlab 正确解释或Matlab引擎已经关闭了)。

3.3 获取Matlab命令窗口的输出

要在VC中获得函数engEvalString发送的命令字符串被Matlab执行后在matlab窗口中的输出,可以调用engOUtputBuffer函数。

函数声明:

int engOutputBuffer(Engine *ep, char *p, int n);

参数ep为Matlab引擎指针,p为用来保存输出结构的缓冲区,n为最大保存的字符个数,通常就是缓冲区p的大小。该函数执行后,接下来的engEvalString函数所引起的命令行输出结果会在缓冲区p中保存。如果要停止保存,只需调用代码:engOutputBuffer(ep, NULL, 0)。

3.4 读写Matlab数据

3.4.1从Matlab引擎工作空间中获取变量。

mxArray *engGetVariable(Engine *ep, const char *name);

参数ep为打开的Matlab引擎指针,name为以字符串形式指定的数组名。

函数返回值是指向name数组的指针,类型为mxArray*(mxArray数据类型在本文第4节详细简介)。

3.4.2 向Matlab引擎工作空间写入变量。

int engPutVariable(Engine *ep, const char *name, const mxArray *mp);

参数ep为打开的Matlab引擎指针,mp为指向被写入变量的指针,name 为变量写入后在Matlab引擎工作空间中的变量名。

函数返回值为0表示写入变量成功,返回值为1表示发生错误。

3.5 调用引擎时显示/隐藏Matlab主窗口

默认情况下,以engine方式调用Matlab的时候,会打开Matlab主窗口,可在其中随意操作。但有时也会干扰应用程序的运行,可用以下设置是否显示该窗口。

int engSetVisible(Engine *ep, bool value);

参数ep为打开的Matlab引擎指针,value为是否显示的标志,取值true(或1)表示显示Matlab窗口,取值false(或0)表示隐藏Matlab窗口。

相关文档
最新文档