CSharp使用DLL进行调用MatLab混编
将Matlab代码转换为DLL进行C_混合编程
将 M a t l a b 代码转换为 D LL 进行 C+ + 混合编程王学斌摘 要: 介绍了将 Matlab 代码转换为 DLL 进行 C++混合编程的步骤、 环境设置、 Driver 代码编写 以及发布的技巧, 使得 C++程序员可以在自己开发的程序中利用 Matlab 强大的算法设计功能, 快 速实现符合自己需要的复杂算法。
关键词: Matlab ; DLL ; MCC ; C++multiplymatrix.mfunction m = multiplymatrix(a1, a2) m = a1*a2;eigmatrix.mfunction e = eigmatrix(a1) e = eig(a1);引言1 Matlab 是一个数学计算、 算法设计、 验证的高级工具, 拥 有丰富的数学、 统计、 绘图函数库 , 其 m 代 码 简 单 易 学 、 执 行效率高, 是进行算法设计与验证 的 最 优 工 具 。
但 是 将 m 代码引入自己的程序却需要有一些专业的知识来进行指导。
Matlab 拥有一个自己的代码编译器 mcc , 利用 mcc 可以将 m 代 码 转换为独立执行程序 、 COM 组 件 或 者 DLL 库 。
对 于 C++程序员来说, 最好的方法是将 m 代码转换为 DLL 库, 然后 引入自己的程 序 , 使 得 在 Matlab 中设计的算法可以直接变为自己的 C++程序。
在下一步中, 将这 3 个文件转换到一个 dll 中。
4 生成 DLLMatlab 的代码编译器 mcc 可以创建基于 C 语言的 dll 以及基 于 C++ 语 言 的 dll 。
为 了 简 单 起 见 , 仅 介 绍 C++ 的 dll 创 建方法。
将 以 上 3 个 m 文件拷贝到一个目录中 , 并 在 Matlab 中将工作目录设为该目录 , 然 后 在 Matlab 控 制 台 中 输 入 以 下命 令 :2 转换过程整个过程可以分为以下 4 步: (1) 编写 m 代码。
(完整版)matlab和c++调用DLL方法
(完整版)matlab和c++调用DLL方法Matlab和C++调用DLL方法Matlab可以调用外部DLL,如用C或C++写的DLL。
本文分三个部分介绍Matlab和C++调用DLL方法。
一、C++写dll方法二、C++调用dll三、Matlab调用dll一、C++写DLL方法在CPP文件中和普通CPP没什么区别,在H文件中加上需要导出的函数名,格式如下:extern "C" int __declspec(dllexport)add(int x, int y);蓝色部分是函数返回的类型,红色部分是要导出的函数,就这么简单。
下面是两个整数相加的代码:main.h:extern "C" int __declspec(dllexport)add(int x, int y);main.cpp:#include "main.h"int add(int x, int y){return x + y;}编译即可得到dll文件,我的工程名叫mydll,因此得到的是mydll.dll二、C++调用DLL方法将DLL文件拷入到源文件夹中,在CPP代码中引入windows.h 文件,否则有些方法找不到,用指针来接受参数。
装载DLL,用函数名,卸载DLL。
代码如下:#include#includeusing namespace std;int main(void){typedef double(*padd)(double a,double b);double r;HINSTANCE hDLL;padd add;hDLL=LoadLibrary("mydll.dll");add=(padd)GetProcAddress(hDLL,"add");r=add(5.3,8.6);cout<<r<<endl;< bdsfid="98" p=""></r<<endl;<>FreeLibrary(hDLL);return 0;}三、Matlab调用DLL通常matlab调用DLL有两种方法,一种是用mex文件,另一种是用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编译器2.编写m文件,如add.m(脚本文件和函数文件都可以)function [a,b]=add(x,y)a=2*x+y;b=3*y;end3.生成dll文件输入命令:mcc -B cpplib:addadd.m或者mcc -W cpplib:add -T link:libadd.m4.提取add.ctf,add.h,add.dll,add.lib 共4个文件(更高版本的matlab没有ctf文件,只需另外3个就可以)2.2VC++6.0调用生成的dll文件1.Tools—Options—Directories—Include files,添加matlab内的include目录,如:D:\Program Files\MATLAB\R2007b\extern\include2.Tools—Options—Directories—Library files,添加matlab内的lib目录,如:D:\Program Files\MATLAB\R2007b\extern\lib\win32\microsoft3.新建控制台程序,命名add_test,将上述4个文件放到工程目录下;4.Project—Settings—Link—Input—Object/library modules,添加:add.libmclmcrrt.lib mclmcr.lib。
将matlab函数编译成dll供Cpp调用
作者曾经实现过将matlab函数编译成dll供Cpp调用,这篇文章的目的是对新增的面向对象的的扩展mwArray进行讲解,matlab很容易和C/C++联合起来使用。
以前做过matlab7与c++的混合编程:将matlab函数编译成dll给C++调用,从而加快开发的进度。
但是今天在matlab2008b下面又做了一遍,发现matlab又改了很多东西,诸如增加了面向对象的的扩展mwArray,于是做笔记如下。
(一)总体概念matlab提供了丰富的程序接口,除了matlab最初的版本是用fortran写的之外,后来的版本都是用C写的,因此matlab很容易和C/C++联合起来使用。
matlab有着丰富的库函数,将这些库函数直接编译成dll(windows下是dll,linux下是类似于dll的另外一个东西),给C调用,可以加快工程进度。
步骤如下:1. 设置matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll下面以一个很简单的加法函数为例,说明在VC6和matlab2008b下,怎么做混合编程(二)设置matlab编译器过程如下:1. 在matlab的command window里面敲入mex –setup,matlab会列出所有电脑上所有的编译器。
2. 选择编译器,这里选择2,即VC63.完成之后,敲入mbuild –setup,选择build工具,matlab会列出所有的build工具,同样选择VC6(三)编译m文件首先,写出matlab函数,一个很简单的加法函数,如下:function [c] = MyAdd(a, b);c = a + b;保存为MyAdd.m然后,进行编译,命令如下:mcc -W cpplib:libMyAdd -T link:lib MyAdd其中,mcc是matlab提供的编译命令(可以理解为gcc),对于这一点,matlab的帮助说明如下:-W lib:string link:lib其中-W是控制编译之后的封装格式,cpplib,是指编译成C++的lib,cpplib冒号后面是指编译的库的名字,-T表示目标,link:lib表示要连接到一个库文件的目标,目标的名字是后面的MyAdd,即你写的m函数的名字。
matlab与c#混合编程
引进完该dll后,就可以开始调用matlab里面编写那些函数了。
但引用时有几个要注意的地方:1,matlab里面的函数返回值无论是不是矩阵,在C#里面都是得到一个MW Array数组,MWArray []a=fun();(假设fun是matlab dll里面的函数,返回值是一个矩阵,在C#里面应该用MW Array 数组来装该矩阵)。
2,matlab传进去的矩阵参数都是MWArray类型的,如果往matlab里面的函数穿参数时,就应该这样写:fun2(a[0]);(假设fun2是matlab dll里面的另一个函数),这样,就可以将一个矩阵传到函数里面。
3,在使用从matlab里面计算得到的矩阵,也就是利用MWArray 数组时,可以参考以下两行代码:MWNumericArray temp = (MWNumericArray)a[0]; double[,] Matrix = (double[,])temp.ToArray(MWArrayComponent.Real);//location是下标从0开始的矩阵Matrix 就是可以在C#里面直接调用的矩阵了,也就是一个二维数组了。
基本上就是这些了,能传进去参数,能得到参数,就行了~Matlab有强大的运算功能,在界面制作上则稍显逊色,借助其他编程语言(如C#,VB等)制作界面进行合理的分工会使程序效率更高,更加优秀。
我试了一下用Matlab和C#混合编程,一路坎坷,终于走过来。
由于愚钝,犯了很多低级错误。
想在C#里面调用Matlab程序,需先将matlab中的程序编译成dll文件,然后就可以在C#工程里面调用。
制作dll文件,现在matlab中建立一个工程,file>new>Development Project>Matlab Builder NE>.Net Component。
然后再这个工程里编写相应的函数,编写完后,只需点击下图中的那个小图标,就可以生成相应的dll。
Matlab与C混合编程汇总
ep = engOpen(NULL);
// 在Windows系统中该函数的参数都为“NULL”。
if(ep == NULL)
{
cout<<"无法打开MATLAB引擎。"<<endl; exit(EXIT_FAILURE); } // 是否显示MATLAB窗口:true-显示;false-隐藏。 nStatus = engSetVisible(ep, true); // 设为ture运行时也只是一闪而过 //nStatus = engSetVisible(ep, true); if(nStatus != 0) { cout<<"设置MATLAB显示属性失败。"<<endl; exit(EXIT_FAILURE); } // 为mxArray变量分配空间 A = mxCreateDoubleMatrix(3,3,mxREAL); B = mxCreateDoubleMatrix(3,3,mxREAL); if(A == NULL || B == NULL) { cout<<"为mxArray变量分配空间失败。"<<endl; exit(EXIT_FAILURE); } // 将数组中的数据写入到mxArray空间中 memcpy((void*)mxGetPr(A),(void*)arData,sizeof(arData)); // 使用 内存数据 复制函数memcpy进行复制 // 将矩阵变量A写入到MATLAB引擎空间 nStatus = engPutVariable(ep,"A",A); if(nStatus != 0) { cout<<"矩阵变量写入MATLAB引擎空间失败。"<<endl; exit(EXIT_FAILURE); } // 执行引擎命令求矩阵A的逆矩阵 nStatus = engEvalString(ep,"B=inv(A)"); // B=inv(A)为要在MATLAB中运行的命 令参数
C++ and matlab混合编程方法
{
printf_s("Could not initialize libmyadd2!");
return -1;
}
//-------------------------------
try
{
double aData[4];
for (int k = 0; k < 4; k++)
{
aData[k] = k;
四、参考代码
// C++ and Matlab mixprogram.cpp : Defines the entry point for#34;stdafx.h" #include "libmyadd2.h"
matlab和VC混合编程综述
程序中使用MATLAB编译产生的DLL (VS2005, MATLAB 7.5, mwArray)2007-12-16 14:52:39| 分类:MatLab/Maple/Mat|字号订阅from: /forum/thread-801187-1-1.html程序中使用MATLAB编译产生的DLL (VS2005, MATLAB7.5, mwArray)最近有几个帖子都在讨论有关在C++程序中使用MATLAB编译产生的动态链接库DLL。
本来想用原来帖子中给出的m代码作为例子,无奈那段代码其实无法执行。
为了避免分散注意力,也为了更好地讨论问题,于是决定还是另外新开一个主题,以简单的例子,和大家一起讨论如何在C++程序中使用matlab编译产生的DLL。
同时MATLAB最新版本R2007b刚刚发布不久,其中包含编译器4.7版,有了一些新的特性,于是也借这个例子来验证一下相关的技术有没有发生大的变化。
最近讨论的问题是关于在C++程序中调用MATLAB编译产生的动态链接库。
具体的问题是在调用DLL中函数时传递参数。
我们知道,MATLAB可以把m代码编译成两种DLL,分别是C语言接口和C++语言接口的DLL。
论坛上的问题是关于调用C++接口的DLL中的函数,所以这里我们就以这种DLL为例来介绍。
在C++接口的DLL中,函数的输入、输出参数都是mwArray对象。
所以问题归结为如何在C++程序中使用mwArray。
这个问题本来可以只用一个简单的C++程序来练习,而不需要MATLAB编译的DLL。
不过为了模拟实际情况,选择以一个更为接近实际的m代码作为例子。
在这个例子中,输入输出都是矩阵,至于标量,它也是一个一行、一列的矩阵。
实验环境:Windows 2003 Std Server with SP2 (En),MATLAB R2007b,Visual Studio 2005。
MATLAB安装路径:h:MATLABR2007b。
MATLAB与C语言的混合编程
MAT LAB 与C 语言的混合编程邹益民(兰州石化职工大学仪表科,甘肃兰州 730060) 摘要:介绍了M A T LA B 的特点及其与C 语言混合编程的实现方法,提供了借助C 语言扩展M A T LA B 串行通讯功能的一种应用方案。
展示了用M A T LA B 与C 语言混合编程的应用实例。
关键词:计算机应用;M A T LA B 软件;C 语言;串行通讯 中图分类号:TP313 文献标识码:B 文章编号:100727324(2000)022******* M A T LAB (Matrix Lab oratory 矩阵实验室)是由MathW orks 公司推出的一种应用软件。
它最早是一种用于线性代数等课程的数学工具,由于该软件具有可靠与丰富的矩阵运算与图形处理能力,并且使用方便,扩展灵活,因而受到了控制理论研究人员的广泛关注。
控制工程师们为其增添了大量的实用程序集(又称工具箱),使其可广泛应用于信号处理、系统辨识、多变量控制、最优控制、神经网络等相关控制领域。
1992年推出的交互式模型输入与仿真工具箱SI M U LI NK 更使得M A T LAB 在控制系统的分析应用中如虎添翼。
该软件自M A T LAB 510版之后,集数值处理、图形绘制、界面设计、文件管理、程序设计的功能于一身,成为一种功能强大的开发环境,为工程应用提供了更多的便利条件。
M A T LAB 是一个开放的系统,具有各种接口功能,使用户可以十分方便地与其他应用程序交换数据和信息。
M A T LAB 除可读写各种文件外,还可通过API 函数库将C 语言子程序编译为动态链接函数(库)D LL 文件,大大扩展了M A T LAB 的应用领域。
这样一方面使得M A T LAB 借助C 语言具备了与计算机硬件及各种外部数据采集装置进行交互的能力;另一方面,也使大量熟悉C 语言的控制工程师们可充分利用已有的C 语言程序扩充M A T LAB 的应用能力。
Matlab与CC++混合编程Matlab调用C函数
Matlab与CC++混合编程Matlab调⽤C函数Matlab与C/C++混合编程有很多种⽅式,分别适⽤于不同的情况。
1. 程序主体⽤Matlab编写,有⼀些特别耗时的函数⽤C/C++改写来提⾼效率,或者已经有现成的C/C++函数,应⽤到Matlab程序中(本⽂属于这种情况)2. 程序主体⽤C/C++编写,部分程序想调⽤Matlab函数减少开发时间,本⽂不涉及这种情况,建议读者⾃⾏查阅Matlab帮助⽂档⼀点点废话Matlab有着⾮常详细的帮助⽂档,建议直接阅读其帮助⽂档,市⾯上很多Matlab书籍都是简单的翻译翻译帮助⽂档,例⼦都是照抄,还有很多错误和断章取义的地⽅,参考这样的书籍容易被带上弯路。
打开Matlab,按F1打开帮助,此部分内容在:MATLAB->Advanced Software Development->MATALB API for Other Languages什么是MEX-file简单来说MEX-file是⼀种预编译的,⽤其他语⾔(C/C++,Fortran)编写的函数库,可以直接被Matlab调⽤。
正如前⾯提到的,这种⽅式适⽤于两种情况:1. 程序中有⼀部分代码耗时巨⼤,想通过改写这部分函数提⾼速度2. 已经有⼤量C/C++或Fortran的函数库,想直接⽤Matlab调⽤,避免重复开发这两种情况⽤MEX-file的这种⽅案来解决都是⾮常合适的,因为这种调⽤⽅式⾮常⽅便,你需要注意地只是数据结构的转换。
这种⽅式⽀持C/C++和Fortran,本⽂主要将C/C++。
如何创建可供Matlab直接调⽤的MEX-file1.安装Matlab⽀持的编译器在Matlab命令窗⼝输⼊:mex -setup如果你的电脑已经安装了Matlab⽀持的编译器,这时候你应该会看到设置编译器的提⽰命令,跟着⼀步步下去就可以了。
注意:如果你电脑只安装了⼀个⽀持的编译器,这⼀步会⾃动⽤此编译器进⾏配置,如果有多个⽀持的编译器,Matlab会引导你选择要使⽤哪个编译器。
matlab compiler与c语言混合编程
matlab compiler与c语言混合编程经过一个多月的努力,在老师的帮助和自己的琢磨之下,终于对vc与matlab的混合编程有所了解。
且举一例。
首先要在自己的matlab7.0上安装MEX和mBuilder,安装方法是在matlab命令窗口中输入mex-setup,按照一系列的步骤安装下去。
然后再在命令窗口中输入mbuilder-setup,同样的方法就可以安装mbuilder。
在matlab中打开一个空的m文件,向里面写下列代码,并将其保存为zhengtaifenbuhanshu.m:function y=zhengtaifenbuhanshu(x,u,d)%x为变量,u为均值,d为方差y=normcdf(x,u,d);我的目的是在c语言中可以调用matlab中的正态分布函数。
这个函数有三个输入参数,一个输出参数。
然后在matlab命令行中打入:mcc -l zhengtaifenbuhanshu.m -o dllnormcdf。
这样就生成c共享(动态)库文件。
其中zhengtaifenbuhanshu.m是要编译的m文件,最后编译的名称为dllnormcdf。
-o表示要编译成的名字,如果没有-o,则编译后生成的文件名是与第一个要编译的文件名一致,就是这里的zhengtaifenbuhanshu。
上面命令的作用是将zhengtaifenbuhanshu.m函数生成名字为dllnormcdf的c语言动态库。
注意编译的路径,如果zhengtaifenbuhanshu是你放在一个matlab中work的一个包中,那么matlab主窗口上面的Current Directory要选择好zhengtaifenbuhanshu.m这个m文件所在的地方。
按回车编译成功后,你会在编译的文件夹(默认的是work中)中看到多了几个生成的文件:dllnormcdf.cdllnormcdf.ctfdllnormcdf.dlldllnormcdf.expdllnormcdf.exportsdllnormcdf.hdllnormcdf.libdllnormcdf_mcc_component_data.c在生成的文件中,dllnormcdf.h文件是编译结果函数库的函数声明头文件,而dllnormcdf.lib文件是最终用户在编译自己的可执行应用程序所必须的库文件,dllnormcdf.dll 文件就是最终用户的可执行应用程序运行时所需要的动态库。
c_调用matlab函数(混合编程)
第2部分实战练习(自己做的)2.1 c#调用matlab函数matlab版本2009b,c#版本vs2008.2.1.1 matlab函数编译成dll文件(1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。
%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩阵相加,相减[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2display('矩阵大小不相同')error('参数错误');endaddRlt=a+b;minusRlt=a-b;end%-----------------------------------------------------------两个输入参数,两个输出参数,并且都是矩阵形式(2)在matlab 命令窗口输入deploytool,弹出如下窗口或者点击matlab的主菜单desktop→deploy tool获得如下面图所示的窗口,然后在file→new→deployment project 中点击。
获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)修改(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点[add class]比如myMathClass;之后再给它添加方法(它就是函数了),点[add files],如下图所示。
本实例中给它添加了MatrixOpera等函数。
class方法(4)完了之后就可以编译了。
编译出来后需要一两分钟的时间。
编译(5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。
Vc调用matlab导出的dll,实现vc与matlab混合编程
软件英才网软件行业驰名招聘网站Vc调用matlab导出的dll,实现vc与matlab混合编程Vc调用matlab导出的dll,实现vc与matlab混合编程写这篇博客的目的就是想把前段时间的工作交接下,让后来人接手这个项目的人迅速的入门。
文章虽短,在项目初期可是搜刮了很多资料花了不少的时间。
为了与win7兼容,matlab应该安装2010a或2010b。
Matlab7导出的dll在win7下的vc2010中不兼容。
1:首先为matlab选择编译器在命名行窗口输入:mex -setup 按照提示选择vc2010 2:选择builder输入:mbuilder -setup 同样选择vc20103:将使用matlab写成的代码封装成函数,确认无错后开始生成dll。
在命令行输入:mcc -W cpplib:h_single -T link:lib h_single.m其中h_single是要导出的dll名称,h_single.m是matlab源文件。
不同版本的matlab生成dll的时间不一样,不知道我使用的matlab2012a为什么这么慢。
如果一切顺利,那么在.m文件目录下将会产生.lib,.dll,.h,.cpp,.ctf(matlab2010好像不再生成.ctf文件)等几个文件。
我们需要使用.lib,dll,.h文件。
dll生成后,剩下的就是在vc中调用了。
这跟使用其他dll是一软件英才网软件行业驰名招聘网站样的。
首先要包含dll头文件,除了要将本次生成的.lib文件填入:链接器-》输入内。
还需要加入mclmcr.lib 和mclmcrrt.lib。
最后将dll 文件放在可执行文件目录下。
matlab2010好像不再生成.ctf文件,因此不需要将ctf文件放在当前目录下,而在matlab7中却需要。
这些都只是准备工作,包含了头文件才能在vc内使用。
传入matlab函数的数据是有一定格式的。
因此需要将数据准备下,准备好之后传给matlab计算函数。
VC和Matlab混合编程
VC和Matlab混合编程VC调用Matlab的方法有多种,为了对混合编程有一个大概认识,将常用的几种方法中介绍一下:一、通过Matlab Engine方式Matlab Engine是指一组Matlab提供的接口函数,支持C语言,Matlab Engine采用C/S(客户机/服务器)模式,Matlab作为后台服务器,而C程序作为前台客户机,通过Windows的动态控件与服务器通信,向Matlab Engine传递命令和数据信息,从Matlab Engine接受数据信息。
用户可以在前台应用程序中调用这些接口函数,实现对Matlab Engine的控制。
采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行,我认为适合个人使用或做演示用,因此不打算介绍。
二、直接调用Matlab的C/C++数学函数库Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用C\C++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。
可以看出用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对C\C++语言比较熟悉,可以看出使用这种方法调用Matlab的工具箱函数有很大困难。
适合对C\C++语言比较熟悉的用户使用。
三、用Matlab自带的Matlab CompilerMatlab Compiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令),这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。
matlab与C混合编程步骤详解
1MATLAB Compiler 是MATLAB自带的一个编译器,它能将m文件转化成 C、C++或p等各种类型的源代码,并根据需要生成可执行文件、lib文件(库文件)、dll文件或S函数文件等。
Matlab所使用的编译器包括了MATLAB 的C\C++数学库函数以及图形库。
必须保证编译器的正确配置,因为编译器使用了C\C++库函数,所以在使用前需要使用mex -setup 和 mbuild -setup两个命令对编译器进行配置。
步骤如下:1. 设置Matlab的编译器,使用外部的VC或者gcc等编译器。
2. 编译m文件成dll3. 设置VC等的继承环境,设置C需要用到的静态库和动态库4. 编写C调用dll1.1设置MATLAB编译器首先要安装Matlab 编译器,一般来说,在安装了Matlab后编译器就己经安装了,所在就只需要对Matlab编译器进行设置。
1.1.1 编译环境设置首先设置系统的环境变量,点击“我的电脑”属性-→系统特性--→高级-→环境变量-→添加系统变量Matlab值为Matlab的安装路径:G:\matlab7.0\bin\win32,重启电脑即可。
1.1.2 MATLAB7.0 编译器设置(a) 为编译后产生的MEX文件进行预配置在Matlab 的命令窗口(Command Window) 键入“mex -setup ”命令后,按回车键,安装Matlab 编译器;(b) 为产生独立外部应用程序进行预配置对Matlab编译器mbuild应用程序进行设置,运行Matlab ,在Matlab 的命令窗口(Command Window) 键入“mbuild -setup ”命令后,按回车键,安装Matlab 编译器;1.2 将MATLAB函数转成DLL函数在Matlab的Command Window /下输入命令:命令 1 :mcc -W lib:dlltest -T link:lib huatu_test.m或命令 2 :mcc -W cpplib: dlltest -T link:lib huatu_test.m命令1生成的是C,命令2生产的是C++。
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。
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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CSharp使用DLL进行调用MatLab混编
Lanix Beavis 2013/1/27
Beijing Normal University, 978109939@
软件配置 (2)
一、生成DLL库 (2)
1. 函数准备 (2)
2. 环境预设 (2)
3. DeploymentTool生成DLL (3)
二、CSharp调用DLL (6)
1. 添加引用 (6)
2. 调用实例 (6)
3. 加载错误 (7)
软件配置
MATLAB:Version 7.11.0.584(R2010b),64-bit(win64)
CSharp:Visual Studio 2010专业版,4.0.30318 RMRel,64-bit(win64)
一、生成DLL库
1. 函数准备
2. 环境预设
3. DeploymentTool生成DLL
点击Desktop->Deployment Tool,点击“here”或->New Project生成新项,此处为M2CTEST.prj 。
点击[Add class]生成指定名称的类,点击[Add files]添加M方法文件作为该类下的方法。
添加类及方法后,点击打包文件,生成的dll文件在M2CTEST\src目录下。
二、CSharp调用DLL
1. 添加引用
启动Visual Stidio新建新项目,此处项目为控制台应用程序ConsoleApplication2。
在ConsoleApplication2中添加项目引用,右键单击“引用”,点击“添加引用”,包括自己生成的DLL和Matlab环境DLL:
M2CTEST\src\M2CTEST.dll
Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0\MWArray.dll
在Program.cs中添加类引用:
using .Arrays; //用于数据转换
using .Utility; //用于绘图
using M2CTEST; //自己生成的DLL库,调用Matlab函数
2. 调用实例
运行结果如下
3. 加载错误
在运行的时候,如果遇到错误“未能加载文件或程序集“MWArray, Version=2.10.1.0, Culture=neutral, PublicKeyToken=e1d84a0da19db86f”或它的某一个依赖项。
试图加载格式不正确的程序”,是因为Matlab生成的是32位的DLL库,而当前的CSharp平台是64位的。
解决办法是:右键单击ConsoleApplication2->属性->生成->目标平台,选择x64。