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

合集下载

VC与Matlab混合编程

VC与Matlab混合编程

VC与Matlab混合编程本⽂主要介绍VC与Matlab混合编程的两种⽅法,并详细介绍了VC向Matlab传递复杂数据:结构体的⽅法,有详细代码说明。

Matlab 主要⾯对科学计算、可视化以及交互式程序设计的⾼科技计算环境,但由于Matlab开发平台上开发的程序不能脱离Matlab运⾏环境,因⽽在处理⼀些实际应⽤问题时显得灵活性不⾜,⽽VC++则在⼀定程度上能够弥补这⼀漏洞,因此,将⼆者结合共⽤,各献其长,可以为科研⼯作和⼯程开发提供更为强⼤的技术⽀持。

Matlab作为控制系统设计的⼀种通⽤⼯具,它可以很⽅便的和VC进⾏连接。

⼀般⽽⾔,Matlab与VC混合编程的实现⽅法有很多种,这⾥主要介绍以下两种:1. VC调⽤Matlab Engine的⽅式:Matlab Engine是⼀组Matlab提供的接⼝函数,⽀持C/C++语⾔,Matlab Engine采⽤C/S(客户机/服务器)模式,Matlab作为后台服务器,⽽C/C++程序作为前台客户机,向Matlab Engine传递执⾏命令和数据信息,从Matlab Engine接收执⾏结果。

⽤户可以在前台应⽤程序中调⽤这些接⼝函数,实现对Matlab Engine的控制。

采⽤这种⽅法⼏乎能利⽤Matlab全部功能,但是需要在机器上安装Matlab软件,缺点是执⾏效率较低。

下⾯简单介绍下这种⽅式的实现步骤:1.1 API接⼝介绍先来介绍⼀组Matlab提供的引擎API接⼝:(仅作简单功能介绍,详细参数说明请参考Matlab帮助)Engine* engOpen(const char* startcmd)启动Matlab引擎int engClose(Engine* ep) 关闭Matlab引擎int engEvalString(Engine* ep, const char* string)执⾏Matlab表达式mxArray* engGetArray(Engine* ep, const char* name)获取⼀个变量数组的值int engPutArray(engine* ep, const mxArray* mp)设置⼀个变量数组的值int engPutVariable(Engine *ep, const char *name, const mxArray *pm)同上mxArray *engGetVariable(Engine *ep, const char *name)获取⼀个变量int engOutputBuffer(Engine* eP,char* p,int n)获取输出字符串1.2 VC环境配置要想在VC集成环境下调⽤Matlab引擎实现VC和Matlab的混合编程,⼀般需要经过以下⼏个必要的步骤:(以下以Matlab2008a和VS2005版本为例)(1)添加include路径:将“\extern\include”(在Matlab的安装路径下)路劲添加到VC编译器的include下(2)添加lib路径:将“\extern \lib\win32\microsoft” (在Matlab的安装路径下) 路径添加到VC编译器的lib下(3)加载lib:需要加载⾄少libmx.lib、libmat.lib、libeng.lib三个库(4)include头⽂件:在要使⽤ engine 函数的地⽅包含engine.h头⽂件1.3 引擎调⽤接下来就可以在VC中调⽤Matlab引擎了,简单的⽰例代码如下:#include "engine.h"#pragma comment(lib, "libeng.lib")#pragma comment(lib, "libmx.lib")#pragma comment(lib, "libmat.lib")void TestDeno(){Engine* pEng = NULL;if (!(pEng = engOpen(NULL))){printf("Open matlab enging fail!");return;}//call Engine plot A*sin(t)+B A=2 B=1mxArray *A = NULL;double init = 2;A = mxCreateDoubleMatrix(1, 1, mxREAL);memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "A", A);init = 1;memcpy((void*) mxGetPr(A), (void*)&init, sizeof (double));engPutVariable(pEng, "B", A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng, "t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL != pEng){engClose(pEng);}}⽰例代码通过VC调⽤Matlab引擎,绘制正弦曲线,相对简单,就不再详细解释,效图如下:2. VC调⽤Matlab DLL的⽅式DLL是⼀个可执⾏的⼆进制⽂件。

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 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engOutputBuffer,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engEvalString,该符号在函数_WinMain@16 中被引用1>engwindemo.obj : error LNK2019: 无法解析的外部符号_engPutVariable,该符号在函数_WinMain@16 中被引用等链接错误;这就需要设置下面的库文件目录2、添加库文件目录在刚才调出来的对话框中,设置库目录:选择“显示以下内容的目录”下的选框选择“库文件”添加matlab目录下的C:\Program Files\MATLAB\R2011a\extern\lib\win32\microsoft注意:如果是项目要生成的是64位程序那么应该选择的是C:\Program Files\MATLAB\R2011a\extern\lib\win64\microsoft点击确定退出对话框,然后给项目添加链接库输入项:在解决方案资源管理器里选择对应的项目单机右键选择最下面的“属性”弹出属性对话框,在右边依次选择“配置属性”->“链接器”->“输入”,然后在右边“附加依赖项”那一项加上libeng.lib libmx.liblibmat.lib单击确定退出注意:(1)不要删除原有的依赖项(2)依赖项之间用空格隔开做到这一步时生成时就没问题出现了,但是运行程序时会出现“因为计算机中丢失libeng.dll”等类似问题第(3)步就解决这个问题的。

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

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

VC++中使用MATLAB的C++数学库和MCC生成的程序(转)2008-03-31 12:38引言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 –setupmbuild -setup(二)数据处理函数1、没有使用图形相关的函数由于MATLAB的编译器只能对函数m文件进行编译,所以如果原来的程序是脚本程序应改写成函数形式。

举例如下:建立一个m文件test1.m,内容如下:function y = test1(n)y = 1 ;for i = 1 : ny = y * i ;end用如下命令对其进行编译:”mcc -t -L Cpp test1如果程序由多个m文件组成,在编译命令中只需要指定主文件即可,mcc会自动查找相应的m文件进行编译;编译完成后会得到与m文件名相对应hpp和cpp文件,拷到我们建立的VC工程中去。

Visual-C#与Matlab混合编程示例(含代码)

Visual-C#与Matlab混合编程示例(含代码)

Visual C# 与Matlab 混合编程由于Visual C# 与Matlab 混合编程的资料并不多,本文通过一个实例来阐述Visual C# 与Matlab 混合编程的方法。

一、混合编程的 4 种方式1. 通过从Matlab的*m文件中生成C语言版本的DLL1) 在Matlab中写好m文件;2) 使用Matlab的编译器,编译为C#能识别的DLL文件;3) 建立C#工程,在工程中引用上一步生成的文件;2. C#调用Matlab工作区计算并返回结果主要使用engOpen, engClose, engPutVariable, engEvalString, engGetVariable 函数进行操作。

大致过程如下:MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b ;" ); mx_c = MatlabCSharp.engGetVariable(ep, "ml_c" );3. 使用Matlab DeployTool 生成COM 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> Generic COM Component2) 添加相应的M 文件3) 保存,编译4) 新建C#工程,引用生成的DLL文件。

4. 使用Matlab DeployTool 生成.Net 组件1) 单击菜单New Deployment Project -> MATLAB Builder NE -> .Net Component2) 添加相应的M 文件3) 保存,编译4) 新建C# 工程,引用生成的DLL 文件。

C++调用matlab动态库

C++调用matlab动态库

C++调用matlab动态库环境:Windows 7旗舰版(32位),VS2008,Matlab R2010b1. 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] NoneCompiler:由于我们是需要用VC来调用Matlab函数,因此我们选择2,回车,出现Please verify your choices:Compiler: Microsoft Visual C++ 2008 SP1Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n?键入y后回车,出现*************************************************************** ************Warning: MEX-files generated using Microsoft Visual C++ 2008 requirethat Microsoft Visual Studio 2008 run-time libraries beavailable on the computer they are run on.If you plan to redistribute your MEX-files to other MATLAB users, be sure that they have the run-time libraries.*************************************************************** ************Trying to update options file: C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB \R2010b\mexopts.bat From template:D:\PROGRA~1\Matlab\bin\win32\mexopts\msvc90opts.bat Done . . .*************************************************************** ***********Warning: The MATLAB C and Fortran API has changed to support MATLABvariables with more than 2^32-1 elements. In the near future you will be required to update your code to utilize the new API. You can find more information about this at:/doc/35346238.html,/support/solutio ns/en/data/1-5C27B9/?solution=1-5C27B9 Building with the -largeArrayDims option enables the new API.*************************************************************** ***********如果出现以上说明,则证明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 的安装路径,但是在我查看资料的时候看到很多是D:\MATLAB2010\extern\lib\win32\microsoft\msvc60这个路径,但是我用的是MatlabR2010a,msvc60是matlab6.5老版本才有的,10.0版本没有这个文件,所以我们把路径设到D:\MATLAB 2010\extern\lib\win32\microsoft 就可以了)。

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程配置设置

MATLAB与VC混合编程相关配置的设置MATLAB与VC的混合编程中,需要对电脑的“环境变量”和VC的“环境配置”进行设置,然后才可以进行程序的调用。

(1)电脑中“环境变量”的设置:对于win10系统控制面板→系统→高级系统设置→环境变量→系统变量→path中添加D:\softwares\MATLAB\ bin\win64,该路径是MATLAB中dll文件的路径,在path 中添加该路径的目的是让VC在运营时能够读取dll文件。

否则VC在运行时可能会出现“计算机丢失**.dll文件”的情况。

对于win7系统的“环境变量”设置,同样是在path中进行的。

(2)VC的环境配置首先需要建立一个新项目,如MyAdd.cpp。

项目→MyAdd属性→VC++目录→包含目录→D:\softwares\MATLAB \extern\include;项目→MyAdd属性→VC++目录→库目录→D:\softwares\MATLAB\installation document\extern\lib\win64\microsoft。

C/C++→常规→附加包含目录→D:\softwares\MATLAB \extern\include;C/C++→常规→调试信息格式→程序数据库(/Zi);链接器→常规→启用增量链接→是(/INCREMENTAL);链接器→常规→附加库目录→D:\softwares\MATLAB\ extern\lib\win64\microsoft;链接器→输入→附加依赖项→libMyAdd.lib,mclmcrrt.lib,libmx.lib,libmat.lib,mclmcr.lib。

其中在输入时这些lib之间用回车换行。

上述步骤的工作界面如下所示:需要注意:在进行VC与MATLAB混合编程的过程中,用到的环境是32位还是64位,在这里需要是相同的编程环境才可以相互调用,如:上图中如果是x32,则需要点击“配置管理器”进行重新设置。

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”项中添加环境变量。

添加头文件和库文件搜索路径有(本计算机的文件搜索路径为):F:\MATLAB6P5\EXTERN\INCLUDEF:\MATLAB6P5\EXTERN\INCLUDE\CPP同时将MA TLAB的链接库添加到VC中。

从“Tools->Options->Directories”中“Show directories for:”下拉框里选择“Library files”,然后再在“Directories”项中添加环境变量。

在C++中调用Matlab

在C++中调用Matlab
5)将Matlab中的运行结果回传给C、C++
二、程序实现
我们通过一个简单的程序demo.c来说明C、C++对Matlab的调用。
#include
#include
#include
#include
/*在头文件中加入engine.h。其包含了调用的Matlab函数声明。*/
#include "engine.h"
在c,c++中调用Matlab
在பைடு நூலகம்,c++中调用Matlab
在C、C++中调用Matlab
Matlab是美国MathWorks公司的产品,是一种以矩阵为基本编程单位的高效数值计算语言。Matlab集科学计算、图像处理、声音处理于一体,为用户提供了丰富的Windows图形界面设计方法,使用户能够在利用其强大数值计算功能的同时设计出友好的图形界面
engClose(ep);
mxDestroyArray(a_ptr);
return(0);
}
当然,该程序在编译之前还需设置一些环境参数。在不同的开发环境中,其设置方法略有差异,我们以Borland C++ builder开发平台为例加以说明。
1)首先必须完成Matlab中链接库的导入工作。在Matlab\extern\include中存在_libmx.def、_libmat.def、_libeng.def等定义文件,在DOS环境中对它们执行命令:
另一种方式是选择将一个自定义的数据结构复制到mxArray中,值得注意的是Matlab在存储矩阵时是按列序保存的,而在C、C++中是按行序保存的,所以转换时注意分清下标。
3)调用engPutArray函数将矩阵放入到Matlab工作区中。

C++如何调用matlab函数

C++如何调用matlab函数

C++如何调用matlab函数
C++如何调用matlab函数
C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的.基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。

C++如何调用matlab 函数?下面就一起来了解看看吧!
本来电脑上安装的是matlab2012b,但是好像2012b只有64位的,故重新安装matlab7,安装完注册一下,cmd cd到matlab7的程序目录bin文件夹下,注册 matlab /regserver,就可以调用matlab了,先测试第一种方法,调用引擎,engOpen、engSetVisible、engClose
engEvalString(m_pEngine, "x1 = 0.01 : 0.01 : 10 * pi");
engEvalString(m_pEngine, "x2 = -10 * pi : 0.01 : -0.01");
engEvalString(m_pEngine, "y1 = sin(x1)./x1");
engEvalString(m_pEngine, "y2 = sin(x2)./x2");
engEvalString(m_pEngine, "plot([x2 x1], [y2 y1])");
在台式机上可以运行,但是到了笔记本上engOpen返回false,经过研究发现有可能是管理员权限的问题,
项目右键-属性-链接器-清单文件-uac执行级别选择requireAdministrator,重新编译运行果然正确了,先记录下来。

【C++如何调用matlab函数】。

MATLAB 与 C 语言的接口

MATLAB 与 C 语言的接口

MA TLAB 到C 语言程序的转换可以由两种途径完成,其一是MA TLAB 自己提供的C 语言翻译程序mcc, 另一种是原第3 方公司MathTools 开发的MA TCOM。

后者出现较早,功能远比MATLAB 自己的翻译程序强大,所以MathTools 公司已经被MathWorks 公司收购,并已将其开发技术融于新推出的MA TLAB 6.0 (Release 12) 中。

依本人的观点,二者都不完善,有大量的MA TLAB 函数及数据类型是不能兼容变换的,所以有时会发现将简洁的MA TLAB 程序翻译成 C 语言程序很晦涩。

翻译后的 C 程序几乎不适合手动去维护,更谈不上升级了。

有几个不兼容的地方是不能令人容忍的,例如eval() 函数在C 翻译下是不兼容的,最新的MA TLAB 6 才刚刚敢说已经部分兼容了,但离真正的兼容还有很长的路要走,有很多艰难的技术困难需要克服,短时间内不可能有突破性的进展。

另一个大的问题是,众所周知,MATLAB 新的控制系统工具箱中定义了大量的LTI 类,MATLAB 5 开始也允许使用类与对象的概念,这已经向―面向对象‖的编程走了一大步,但MA TLAB 到C 的翻译明显都不支持―对象‖的数据类型,所以在控制系统分析与设计(当然还有其他的领域) 中这样的转换几乎没有什么实际意义,所以不要将这样的转换太理想化。

从转换的程序速度来看,因为mcc 和MATCOM 都沿用了MATLAB 的程序运算机制,所以不可能大幅度地提高程序运行速度。

相反地,如果将MATLAB 程序中明显的瓶颈部分用 C 语言按照MEX 格式编写,则可以大大加快速度。

在《科学运算语言MA TLAB 5.3 程序设计及应用》一书中以例子做过探讨,MCC 可以比快50%, 而MEX 的形式可能快上百倍。

〖举例〗分形问题:从初始点(x0,y0) 出发,按下面的公式生成新的点(x1,y1)其中gi 为(0,1) 区间均匀分布的随机数。

VC++中如何能调用matlab函数

VC++中如何能调用matlab函数

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命令提示符后执行上述命令,重新注册。

c++调用matlab函数

c++调用matlab函数

一、问题描述有关在C++程序中使用MATLAB编译产生的动态链接库DLL,看了好多帖子,感觉描述的不尽详细,调试过程费了好多劲,现在用文字和图片的形式记录一下自己学习的过程。

MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。

这里以调用C++接口的DLL中的函数为例来介绍。

在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。

所以问题归结为如何在C++程序中使用mwArray。

在这个例子中,输入输出都是矩阵,至于标量,可以作为矩阵的一行或一列传递。

二、实验内容:把一个简单的m代码编译成C++接口的DLL,然后在C++程序中调用。

为了简单起见,这里的C++程序是一个Win32 Console程序,而不是Windows图形界面的程序,不过不妨碍我们的讨论。

三、实现环境:Windows xp 2002 sp3Matlab 2008b 安装路径:D:\Program Files\MATLAB\R2008bVs 2008 sp1 安装路径:D:\Program Files\Microsoft Visual Studio 9.0四、配置matlab生成dll文件:1.在matlab 中选择C++编译器>> mbuild -setupPlease choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?nSelect a compiler:[1] Lcc-win32 C 2.4.1[2] Microsoft Visual C++ 6.0[3] Microsoft Visual C++ .NET 2003[4] Microsoft Visual C++ 2005[5] Microsoft Visual C++ 2005 Express Edition[6] Microsoft Visual C++ 2008[0] NoneCompiler: 6The default location for Microsoft Visual C++ 2008 compilers is C:\Program Files\Microsoft Visual Studio 9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio 9.0 anyway [y]/n? nPlease enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio 9.0] D:\Program Files\Microsoft Visual Studio 9.0Please verify your choices:Compiler: Microsoft Visual C++ 2008Location: D:\Program Files\Microsoft Visual Studio 9.0Are these correct [y]/n? Y******************************************************************* *********Warning: Applications/components generated using Microsoft Visual Studio2008 require that the Microsoft Visual Studio 2008 run-timelibraries be available on the computer used for deployment.To redistribute your applications/components, be sure that thedeployment machine has these run-time libraries.******************************************************************* *********Trying to update options file: C:\Documents and Settings\Administrator\ApplicationData\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone . . .>>2.编写m文件编写myadd2.m文件(如下),保存在D:\My Documents\MATLAB目录下;同时把该目录设置为matlab当前目录。

手把手教你用C#调用MATLAB函数

手把手教你用C#调用MATLAB函数

】【【转载】手把手教你用C#调用MATLAB函数编译环境:Microsoft Visual Studio2008版本9.0.21022.8RTM Framework版本 3.5已安装的版本:ProfessionalMicrosoft Visual Basic200891986-031-5000002-60050Microsoft Visual Basic2008Microsoft Visual C#200891986-031-5000002-60050Microsoft Visual C#2008Microsoft Visual C++200891986-031-5000002-60050Microsoft Visual C++2008Microsoft Visual Studio2008Tools for Office91986-031-5000002-60050Microsoft Visual Studio2008Tools for OfficeMicrosoft Visual Web Developer200891986-031-5000002-60050Microsoft Visual Web Developer2008Crystal Reports AAJ6G-K0MSA4K-680002ZCrystal Reports Basic for Visual Studio2008Matlab2008b首先需要做的工作是matlab编译器的设置,设置方法为:在Command window中输入mbuild-setup 显示如下>>mbuild-setupPlease choose your compiler for building standalone MATLAB applications:,Would you like mbuild to locate installed compilers[y]/n?n%选择nSelect a compiler:[1]Lcc-win32C2.4.1[2]Microsoft Visual C++6.0[3]Microsoft Visual C++.NET2003[4]Microsoft Visual C++2005[5]Microsoft Visual C++2005Express Edition[6]Microsoft Visual C++2008[0]NoneCompiler:6%选择6,其他编译器可以选相应的选项,我没有验证过The default location for Microsoft Visual C++2008compilers is C:\Program Files\Microsoft Visual Studio9.0,but that directory does not exist on this machine.Use C:\Program Files\Microsoft Visual Studio9.0anyway[y]/n?n%选择nPlease enter the location of your compiler:[C:\Program Files\Microsoft Visual Studio9.0] D:\Program Files\Microsoft Visual Studio9.0%选择您自己的当前安装路径Please verify your choices:Compiler:Microsoft Visual C++2008Location:D:\Program Files\Microsoft Visual Studio9.0Are these correct[y]/n?y%看上述信息,如果正确选择y**************************************************************************** Warning:Applications/components generated using Microsoft Visual Studio2008require that the Microsoft Visual Studio2008run-timelibraries be available on the computer used for deployment.To redistribute your applications/components,be sure that thedeployment machine has these run-time libraries.**************************************************************************** Trying to update options file:C:\Documents and Settings\Administrator\Application Data\MathWorks\MATLAB\R2008b\compopts.batFrom template: D:\PROGRA~1\MATLAB\R2008b\bin\win32\mbuildopts\msvc90compp.batDone... %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%至次编译器设置完成%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%在matlab的Command window中输入:>>deploytoolMatlab产生deployment tool配置窗口单击新建按钮,新建工程------>选择MATLAB Builder NE选项卡----->选择.NET Component 并添加工程名eaqual(测试用名,其实工程名称就是你导入C#后的命名空间名称,Matlab会在当前工作目录中新建文件夹文件夹名既为equal)---->点击ADD File按钮将你需要编译的MATLAB函数添加进当前工程,我这里导入的是D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m文件---->点击build.deployment tool output窗口输出以下信息:Build output(2009-03-2815:32:55).[url=matlab:mcc%20-F%20%27E:%5CMATLAB%5Ceaqual.prj%27]mcc-F 'E:\MATLAB\eaqual.prj'[/url]等待...................................有点久当输出以下信息时编译成功了Compiler version:4.9(R2008b)Warning:Duplicate directory name:E:\MATLAB.mcc-W 'dotnet:eaqual,Eaqual,0.0,private'-d'E:\MATLAB\eaqual\src'-T'link:lib'-v'class{Eaqual:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m}'Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Processing D:\Program Files\MATLAB\R2008b\toolbox\aero\mcc.enc Processing D:\Program Files\MATLAB\R2008b\toolbox\matlab\mcc.enc Processing include files...2item(s)added. Processing directories installed with MCR...The file E:\MATLAB\eaqual\src\mccExcludedFiles.log contains a list of functions excluded from the CTF archive.2item(s)added.Generating MATLAB path for the compiled application... Created40path items.Begin validation of MEX files:Sat Mar2815:35:112009End validation of MEX files:Sat Mar2815:35:112009Warning:Name is nonexistent or not a directory:D:\Program Files\MATLAB\R2008b\toolbox\compiler\patch.Deleting0temporary MEX authorization files.Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\aero\aero\angle2quat.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\deployprint.m"(Referenced from:"Compiler Command Line").Parsing file"D:\Program Files\MATLAB\R2008b\toolbox\compiler\deploy\printdlg.m"(Referenced from:"Compiler Command Line").Generating file"E:\MATLAB\eaqual\src\Eaqual.cs".Generating file "E:\MATLAB\eaqual\src\EaqualNative.cs".Generating file "E:\MATLAB\eaqual\src\readme.txt".Generating file "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs".Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqual.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqual.dll" "E:\MATLAB\eaqual\src\Eaqual.cs""E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Executing command: C:\WINDOWS\\Framework\v2.0.50727\csc.exe/nologo/optimize /doc:"E:\MATLAB\eaqual\src\eaqualNative.xml"/t:library/r:"D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll"/resource:"E:\MATLAB\eaqual\src\eaqual.ctf"/out:"E:\MATLAB\eaqual\src\eaqualNative.dll""E:\MATLAB\eaqual\src\EaqualNative.cs" "E:\MATLAB\eaqual\src\dotnet_mcc_component_data.cs"Copying:E:\MATLAB\eaqual\src\eaqual.dll->E:\MATLAB\eaqual\distribCopying:E:\MATLAB\eaqual\src\eaqualNative.dll->E:\MATLAB\eaqual\distrib Copying:E:\MATLAB\eaqual\src\readme.txt->E:\MATLAB\eaqual\distribCompilation completed succesfully.The output is located in E:\MATLAB\eaqual\distrib.You can package the component by clicking on the"ackage"icon in the Deployment Tooltoolbar,or by clicking the Tools->ackage menu when the Deployment Tool panel is selected.To include additional files in the package,click Project->Settings).生成的文件在工程文件夹里面我的是E:\MATLAB\eaqual\distrib\angle2quat.dll至此MATLAB的操作全部完成打开VISUAL Studio2008新建C#工程我这里用的是控制台名为TestOfmatlab_consolt我的是E:\Visual Studio2008\Projects\TEST\TestOfmatlab_consolt添加引用E:\MATLAB\eaqual\distrib\angle2quat.dll和D:\Program Files\MATLAB\R2008b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll(这里我没有用MATLAB画图,所以只引用MWArray.dll)加入命名空间:using .Arrays;将下面代码加入Main函数eaqual.Eaqual eq=new eaqual.Eaqual();.Arrays.MWArray m=10,n=4,j=7,k;MWArray S="XYZ";k=eq.angle2quat((MWNumericArray)m,(MWNumericArray)n, (MWNumericArray)j,(MWCharArray)S);MWNumericArray temp=(MWNumericArray)k;double[,]location=(double[,])temp.ToArray(MWArrayComponent.Real);Console.WriteLine(location[0,0].ToString());Console.WriteLine(location[0,1].ToString());Console.WriteLine(k[2].ToString());Console.WriteLine(k[3].ToString());Console.WriteLine(k[4].ToString());Console.ReadLine();编译运行即可看到输出,此函数是姿态角转四元数函数,具体功能就不做说明了。

C#调用MATLAB生成的dll

C#调用MATLAB生成的dll

C#调用Matlab生成的dll1.1操作环境操作系统●Win7(32位)必需软件:●Matlab R2015a●Visual Studio2012(包含Visual C#和Visual C++)●Net Framework4.0以上1.2操作步骤首先Matlab的打包工具,把Matlab函数打包为dll文件。

然后在C#中,引用生成的dll 文件,并在程序中调用dll中的函数。

下面分步骤介绍:1.2.1路径设定在F盘新建一个名为Matlab的文件夹;启动Matlab.exe,在命令窗口输入pathtool,会弹出如下对话框。

点击【Add Folder】,选择刚才的文件夹即可。

关闭对话框后,在命令窗口输入userpath(‘F:\Matlab’)。

按回车设定完毕。

1.2.2M文件创建在Matlab中新建一个M文件,写入如下函数代码,保存为F:\Matlab\gougu.m。

function w=gougu(a,b)w=a*a+b*bend1.2.3打包生成dll在Matlab命令窗口输入deploytool,弹出如下选项,选择“Library Compiler”出现打包程序窗口界面:在窗口中进行如下选择:Type:.Net AssemblyExplored Functions:选择刚才做好的gougu.m文件Packaging Options:勾选上面的复选框,取消勾选下面的复选框。

填写Library Information各项最后,点击窗口右上角的Package按钮,一直等待到提示打包完成。

打包结束后,会在文件夹中看到生成了的dll文件,路径为“F:\Matlab\gougu\for_redistribution_files_only\gougu.dll”。

1.2.4C#调用dll在Visual Studio2012中,新建一个C#控制台程序或者WinForm应用程序,本例创建的是窗体应用程序,在默认窗体上放入一个标准按钮button1。

C#调用Matlab

C#调用Matlab

2、利用matlab自带的.nettool工具将.m文件转换成.net组件--->.dll文件为接口,它实际上不含任何实现,都是调用另一个.ctf文件来完成具体的功能。
3、在c#中,必须引入mwarray.dll才能拥有在.net中进行矩阵运算所需要的一切。虽然matlab help中只是说推荐,但一般的应用中,只是进行一部分函数的调用,而不是去取得整个运行结果。这个.dll是必须引入的。有时mclmcrrt74.dll这个文件也需要引入。根据具体的要求,需要引入的文件也有所差别。
ResOut=GTN.GetMatchNo(1,MainAdd, ModelAdd, FName.GTM(), Vaval);
MWNumericArray temp = (MWNumericArray)ResOut[0];
//矩阵转换
Array netInterfaceMatrix = temp.ToArray(MWArrayComponent.Real); //c#规范的矩阵
[/redtramp/blog/item/785997264e4d27148b82a1c1.html]
kevin 评论于 2007-11-20 11:34 回复 引用 查看
#2楼 [楼主]
Matlab统计工具箱简介
/space/html/68/t-53768.html
发表于 2007-11-20 11:07 kevin 阅读(1449) 评论(7) 编辑 收藏 所属分类: 技术及文章推介 、软件技术小文
评论
#1楼 [楼主]
补充:
2.c#.net下实现调用
打开或新建一个c#项目(我采用的是编辑器),选中右边的解决方案资源管理器中的引用,点鼠标右键,选添加引用,在弹出来的窗口中选com,然后也找到comtest_1_0.dll,点选择,然后确定就可,此时此com组件也添加到工程里面去了,同样我们可以选择对象浏览器来看comtest及下面的sgltest类,c#测试项目如下:

VC调用matlab的linprog函数-----自己的总结

VC调用matlab的linprog函数-----自己的总结

VC调用matlab的linprog函数-----自己的总结1.编写m文件function [X,f]=lin(f,A,b)[x,fval] = linprog(f,A,b);X=x;f=fval;End保存为lin.m2.将m文件编译为dllmcc -W cpplib:liblin -T link:lib lin.m -v其中,libname为编译后的库文件名,lin.m为matlab的m文件名该命令用于mwArray数据类型生成四个文件(用到的):liblin.ctf liblin.dll liblin.h liblin.lib3.VC++6.0工程的创建与设置(1)建立一个名为Test的C++控制台工程,在工程中添加一个名为test.cpp文件(2)对VC++6.0的设置(与matlab关联,一旦设置后以后就不需再修改)----工具--->选项---->目录----->include files: 加入--e:\matlab7\extern\inlcude------>Library files:加入--e:\matlab7\exterm\lib\win32\microsoft\msvc60(3)针对该工程的设置:工程---->设置----->连接---->对象/库模块:加入mclmcrrt.libliblin.lib(自己制作dll时生成的库文件)注:也可以不在这里设置,在test.cpp文件中加入:#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")(4)将前面生成的四个文件(matlab的works文件夹下)添加到VC6.0建立的工程目录下,将liblin.h添加到工程(工程--->添加到工程---->文件)例: min f = -4x1- x2,s.t. -x1+2x2<=42x1+3x2<=12x1-x2<=3x1,x2>=0(1)在matlab中计算:>> f = [-4;-1];>>A = [-1 2; 2 3; 1 -1];>>b = [4;12;3];>>[x,fval] = linprog(f,A,b)(2)在VC中调用dll具体代码:#include <iostream>using namespace std;#include "mclmcr.h"//mwArray类型定义#include "liblin.h"dll的头文件#pragma comment(lib,"mclmcr.lib")#pragma comment(lib,"liblin.lib")int main(){//初始化程序if(!mclInitializeApplication(NULL,0)){cout<<"Could not initialize the application!";exit(1);}//初始化库if(!liblinInitialize()){cout<<"Could not Initialize the library!";exit(1);}//输入参数f,A,bmwArray A(3,2,mxDOUBLE_CLASS);mwArray f(2,1,mxDOUBLE_CLASS);mwArray b(3,1,mxDOUBLE_CLASS);//输出参数X,fvalmwArray X(2,1,mxDOUBLE_CLASS);mwArray fval(1,1,mxDOUBLE_CLASS);//输入,传给mwArraydouble aa[]={-1,2,1,2,3,-1};//注意,这里的约束系数与在matlab中的不一样double bb[]={4,12,3};double ff[]={-4,-1};//给f,A,b赋值A.SetData(aa,6);b.SetData(bb,3);f.SetData(ff,2);//调用函数lin(2,X,fval,f,A,b);//从X,fval取值double* x;double* fv;x = new double[2];fv = new double[1];X.GetData(x,2);fval.GetData(fv,1);//输出结果cout<<"X = "<<x[0]<<" "<<x[1]<<endl; cout<<"fv = "<<fv[0]<<endl;//关闭库和程序liblinTerminate(); mclTerminateApplication();return 0;}。

C 中调用MATLAB方法

C  中调用MATLAB方法

三种方式在C++中调用matlabC/C++调用Matlab在工程实践中,C/C++调用Matlab的方法主要有调用Matlab计算引擎、包含m文件转换的C/C++文件,以及调用m文件生成的DLL文件。

1利用Matlab计算引擎Matlab的引擎库为用户提供了一些接口函数,利用这些接口函数,用户在自己的程序中以计算引擎方式调用Matlab文件。

该方法采用客户机/服务器的方式,利用Matlab引擎将Matlab和C/C++联系起来。

在实际应用中,C/C++程序为客户机,Matlab作为本地服务器。

C/C++程序向Matlab计算引擎传递命令和数据信息,并从Matlab计算引擎接收数据信息。

Matlab提供了以下几个C语言计算引擎访问函数供用户使用:engOpen,engClose,engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse,engGetVisible,engSetVisible。

下面以C语言编写的、调用Matlab引擎计算方程x3?2x+5=0根的源程序example2.c 为例,说明C/C++调用Matlab计算引擎编程的原理和步骤:#include<windows.h>#include<stdlib.h>#include<stdio.h>#include"engine.h"int PASCAL WinMain(HANDLEhInstance,HANDLE hPrevInstance,LPSTR lpszCmdLine,intnCmdShow){Engine*ep;mxArray*P=NULL,*r=NULL;char buffer[301];doublepoly[4]={1,0,-2,5};if(!(ep=engOpen(NULL))){fprintf(stderr,"\nCan'tstart MATLAB engine\n");return EXIT_FAILURE;}P=mxCreateDoubleMatrix(1,4,mxREAL);mxSetClassName(P,"p");memcpy((char*)mxGetPr(P),(char*)poly,4*sizeof(double));engPutVariable(ep,P);engOutputBuffer(ep,buffer,300);engEvalString(ep,"disp(['多项式',poly2str(p,'x'),'的根']),r=roots(p)");MessageBox(NULL,buffer,"example2展示MATLAB引擎的应用",MB_OK);engClose(ep);mxDestroyArray(P);return EXIT_SUCCESS;}在Matlab下运行example2.exe:mex-f example2.c。

MPLAB 使用(C语言)

MPLAB 使用(C语言)

在E盘根目录建立一个字母或数字建立的文件夹,将目录中18F452.lkr、p18f452.lib、led.c 的三个文件拷入;
打开MPLAB IDE 环境,运行工程建立向导
选择单片机型号:
选择编译器:
在E盘建立的目录下建立工程文件:
加入链接(.LKR)文件,库(LIB)文件,源文件(.C),如果还未建立C文件,可以在工程中再建立加入
建立的工程文件:
选择ICD2作为调试器:
正常连接后的状态:(如果不正常,检查连线,断开USB后重新运行)
配置:
配置前将configuration bits set in code 选择项去除
晶振选择:
关闭看门狗:
关闭低电压编程:
配置后将configuration bits set in code 选择项加上
编译链接程序,产生调试文件
如果编译通过
运行编程目标板
编程成功
运行工程项目
结果是LED 闪烁。

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

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的目录:engEvalString (ep, ”cd ..\\..\\work”);engEvalString是往Matlab里输命令的函数,显然我们的目标是成功运行:engEvalString (ep, ”s=add(a,b)”);当然,目前Matlab中并没有a和b两个变量,因此需要在C中初始化这两个变量并转换成Matlab基本变量类型mxArray,才能将它们输入到Matlab中。

关于mxArray,在第三章会有详细说明。

下面是对a=1,b=2的转换过程:double aval=1, bval=2;mxArray *a=mxCreateDoubleMatrix(1,1,mxREAL);mxArray *b=mxCreateDoubleMatrix(1,1,mxREAL);mxSetPr(a,&aval);mxSetPr(b,&bval);于是可以往Matlab里输入了:(双引号内是在Matlab里的变量名称)engPutVariable(ep,"a",a);engPutVariable(ep,"b",b);运行add.m:engEvalString (ep, ”s=add(a,b)”);编译运行后可以在监控窗口中查看s,确认是3无误。

接下来就是怎样把s从Matlab读入C中的问题了,也很方便:mxArray *s=engGetVariable(ep,"s");显示一下:printf("s=%f",*mxGetPr(s));最后不要忘记关闭Matlab:engClose(ep);用到的几个mxArray也需要释放,在此不述,具体请见第三章。

到此,调用Matlab引擎的全过程就结束了。

不管m文件的函数形式有多复杂,都万变不离其宗,改变的只有变量与mxArray相互转换那一部分,具体请见第三章。

另外,Matlab还提供了将监控窗口中的显示存入某buffer的函数。

可以如下设置:char buffer[1000];engOutputBuffer(ep,buffer,1000);这样,所有显示都会存入buffer中,这对调试很有帮助。

如果想取消这个功能,则:engOutputBuffer(ep,NULL,0);最后还可以将监控窗口关闭或重新打开:engSetVisible(ep,false);engSetVisible(ep,true);以上便是调用Matlab引擎的全部内容。

这种方法步骤简单,调试也方便,所以在一般场合下使用已经足够好了。

二、打包m文件至dll打包m文件至dll相对于调用Matlab引擎,唯一也是最重要的一点好处是便于发布。

在一台没有安装Matlab的电脑中,利用最少的资源运行Matlab程序只有这种方法。

该方法根据dll的不同又可分为两类:一是打包成COM或.NET组件的dll,二是传统的dll。

前者除了在WIN32、MFC中还可在.NET中运行。

本文仅介绍较为简单的打包成传统dll的方法。

下面这个例子将自己编写的加法程序add.m及乘法程序multi.m打包至calc.dll并在C 程序中调用。

add.m如第一章所示,multi.m如下所示。

function s = multi( a, b )s = a*b;第一步,设置Matlab中使用的C语言编译器:mbuild –setup弹出如下提示:Please choose your compiler for building standalone MATLAB applications:Would you like mbuild to locate installed compilers [y]/n?选y的话会列出Matlab默认的几个编译器及其默认路径。

如果没有完全符合的话则重来选n,就会出现更多的选择:Select a compiler:[1] Borland C++Builder version 6.0[2] Borland C++Builder version 5.0[3] Borland C/C++ (free command line tools) version 5.5[4] Lcc C version 2.4.1[5] Microsoft Visual C/C++ version 8.0[6] Microsoft Visual C/C++ version 7.1[7] Microsoft Visual C/C++ version 6.0[0] NoneCompiler:根据个人喜好输入相应编译器序号后,就会要求确认路径。

若没有,则显示如下:The default location for xxxxxxx compilers is C:\xxxxxxx, but that directory does not exist on this machine.Use C:\xxxxxxx anyway [y]/n?选n输入其应该在的路径即可。

第二步,在Matlab中将add.m及multi.m文件编译为calc.dll:mcc -W lib:calc -T link:lib add.m multi.m第一个选项-W的格式是“dll类型:生成的dll名称”,dll类型可以是C下的“lib”,C++下的“cpplib”,COM下的“com”以及.NET下的“dotnet”。

第二个选项-T是生成类型,可以是“link:exe”生成exe文件,以及我们所用的“link:lib”生成dll文件。

正常运行后会生成一排文件,其中有用的是以下这几个:mccExcludedFiles.log:编译中被排斥的项目列表。

calc.h和calc.lib:C程序编写时需要。

calc.dll和calc.ctf:C程序执行时需要。

在mccExcludedFiles.log中有两类被排斥的项目。

一类是Excluded by M-file compilabilty rules,这类排斥是由于m文件使用的Matlab Toolbox函数中调用了被排斥的函数导致的。

一种解决办法是将需要的Toolbox函数进行简化,尽量只使用最基本的Matlab函数。

另一类是Excluded because they ship with the MCR,这类排斥没有影响,无视即可。

第三步,在C程序中调用calc.dll中的函数:首先将calc.h、calc.lib、calc.dll、calc.ctf四个文件拷贝至C程序同一目录中,并在程序中包含calc.h以及在链接的附加依赖项中添加calc.lib。

随后,可以在calc.h文件中找到我们需要使用的几个函数:calcInitialize():calc.dll初始化程序。

calcTerminate():关闭calc.dllmlfAdd(int nargout, mxArray** s, mxArray* a, mxArray* b):调用calc.dll中的加法程序。

mlfMulti(int nargout, mxArray** s, mxArray* a, mxArray* b):调用calc.dll中的乘法程序。

另外,初始化的时候还可以改用calcInitializeWithHandlers设置消息处理函数,这在本章最后详细说明。

下面是调用加法程序的C程序:(所需头文件,引用库等见第五章)//calc.dll初始化calcInitialize();//a=1, b=2转换为mxArray格式double aval=1, bval=2;mxArray *a=mxCreateDoubleMatrix(1,1,mxREAL);mxArray *b=mxCreateDoubleMatrix(1,1,mxREAL);mxSetPr(a,&aval);mxSetPr(b,&bval);//调用calc.dll中的加法程序mxArray *s=NULL;mlfAdd(1,&s,a,b);//显示结果printf("s=%f",*mxGetPr(s));//释放mxArraymxDestroyArray(a);mxDestroyArray(b);mxDestroyArray(s);//关闭calc.dllcalcTerminate();整个调用过程跟调用Matlab引擎非常类似,在程序开头运行dll初始化程序很重要,在编程时容易忽略掉这一步导致出错。

另外,在调用加法的函数mlfAdd中,第一个参量是输出的个数,而输出都需要取mxArray*的地址,也就是mxArray**。

关于mxArray的结构,会在第三章详细说明。

以上便是m文件打包至dll并调用的全过程。

接下来,介绍一下消息处理函数。

前面已经提到,采用打包dll方法调用Matlab函数会导致调试麻烦,因此一个好的消息处理函数是必不可少的。

相关文档
最新文档