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。
- 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。