C#与Matlab混合编程入门教程一:几种混合编程的方法
2011-06-03 17:19
459 查看
/article/5586088.html
C#与Matlab混合编程入门教程一:几种混合编程的方法
以下内容基本转载自一切随心的博客。由于没有使用过前三种方法,因此感兴趣的可以自己深入了解。第四种方法是我在项目中亲自使用,并在尝试不同的Matlab版本之间进行版本更换时碰到了一些问题,希望能够就第四种方法与大家进行一个“入门级”的探讨。
主要参考资料: 《Matlab C# Book》,我看的是第一版的电子书,网上可以搜到。
说实话,我觉得C#与Matlab混合编程相比VC与Matlab混合编程没有啥优势,基本上还是通过P/V Invoke操作Matlab mcc编译器生成的C语言版本的DLL。此外,速度上也慢的吓人-_-
下面简单写写C#与Matlab混合编程的4种方式(可能还不够全,欢迎补充):
1. 通过从Matlab的*.m文件中生成C语言版本的DLL
具体过程:
1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);
2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器有两个LCC和VC2008(注意如果使用VS.net做应用的话,建议编译器选VC2008,否则C#中会告诉你DLL找不到Entry Point)
3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h文件中有导出的函数原型。
4) 建立C#工程,并将前面的dll拷贝到合适路径,使用[ DllImport( "mypluslib.dll ", CallingConvention = CallingConvention.Cdecl)] 将.h文件中的函数使用C#的语法声明。一般来说,这些函数中会有**Initialize,**Terminate和M文件中定义的函数(**代表lib名称)。
5) 使用CsharpMatlabCompilerVer4.cs将C#中的数据类型和Matlab中的矩阵等类型进行变换。该文件定义了MatlabCSharp类,主要是导入了libmx.dll中的一些函数,并封装了一些实用的函数如double2mxArray_scalarReal等。
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组件
注: 老版本的叫ComTool,现在叫做DeployTool。在Command Window里面直接输入deploytool即可
1) 选择New Deployment Project -> MATLAB Builder NE -> Generic COM Component
2) 添加相应的M文件
3) 保存,编译
4) 新建C#工程,添加Reference, Ok
4. 使用Matlab DeployTool生成.Net组件
1) 选择New Deployment Project -> MATLAB Builder NE -> .Net Component
2) 添加相应的M文件
3) 保存,编译
4) 新建C#工程,由于经常要
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
因此需添加MWArray这个Reference,一般安装玩MATLAB Builder NE就有了,放在GAC当中的。
(原文中描述比较简略,所以我打算在教程二中对第四种方法进行一个详细的讲解。欢迎大家继续关注!)
C#与Matlab混合编程入门教程一:几种混合编程的方法
以下内容基本转载自一切随心的博客。由于没有使用过前三种方法,因此感兴趣的可以自己深入了解。第四种方法是我在项目中亲自使用,并在尝试不同的Matlab版本之间进行版本更换时碰到了一些问题,希望能够就第四种方法与大家进行一个“入门级”的探讨。
主要参考资料: 《Matlab C# Book》,我看的是第一版的电子书,网上可以搜到。
说实话,我觉得C#与Matlab混合编程相比VC与Matlab混合编程没有啥优势,基本上还是通过P/V Invoke操作Matlab mcc编译器生成的C语言版本的DLL。此外,速度上也慢的吓人-_-
下面简单写写C#与Matlab混合编程的4种方式(可能还不够全,欢迎补充):
1. 通过从Matlab的*.m文件中生成C语言版本的DLL
具体过程:
1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);
2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器有两个LCC和VC2008(注意如果使用VS.net做应用的话,建议编译器选VC2008,否则C#中会告诉你DLL找不到Entry Point)
3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h文件中有导出的函数原型。
4) 建立C#工程,并将前面的dll拷贝到合适路径,使用[ DllImport( "mypluslib.dll ", CallingConvention = CallingConvention.Cdecl)] 将.h文件中的函数使用C#的语法声明。一般来说,这些函数中会有**Initialize,**Terminate和M文件中定义的函数(**代表lib名称)。
5) 使用CsharpMatlabCompilerVer4.cs将C#中的数据类型和Matlab中的矩阵等类型进行变换。该文件定义了MatlabCSharp类,主要是导入了libmx.dll中的一些函数,并封装了一些实用的函数如double2mxArray_scalarReal等。
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组件
注: 老版本的叫ComTool,现在叫做DeployTool。在Command Window里面直接输入deploytool即可
1) 选择New Deployment Project -> MATLAB Builder NE -> Generic COM Component
2) 添加相应的M文件
3) 保存,编译
4) 新建C#工程,添加Reference, Ok
4. 使用Matlab DeployTool生成.Net组件
1) 选择New Deployment Project -> MATLAB Builder NE -> .Net Component
2) 添加相应的M文件
3) 保存,编译
4) 新建C#工程,由于经常要
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;
因此需添加MWArray这个Reference,一般安装玩MATLAB Builder NE就有了,放在GAC当中的。
(原文中描述比较简略,所以我打算在教程二中对第四种方法进行一个详细的讲解。欢迎大家继续关注!)
相关文章推荐
- 无师自通C#.NET和SQL编程入门免费视频教程大全(由吉日嘎拉精心录制,可以改变一个人职业生涯的入门教程)
- [置顶] MATLAB和c#混合编程实现心电图显示软件
- Matlab与C#混合编程环境设置
- C#与MATLAB混合编程
- 关于matlab与c#混合编程产生的移植问题
- 64位系统vs2010平台下实现C++与matlab R2014混合编程方法示例
- vc&matlab混合编程方法简介
- matlab与c混合编程实现方法
- 混合语言编程―C#使用原生的Directx和OpenGL绘图的方法
- 【转】Matlab和C#混合编程
- Matlab和C#混合编程之数组传值
- Matlab与c语言混合编程接口方法
- 【PHP面向对象(OOP)编程入门教程】17.克隆对象__clone()方法
- matlab和c++混合编程---方法和步骤
- 【PHP面向对象(OOP)编程入门教程】16.__toString()方法
- matlab与c#混合编程之图像参数传递
- C# for Unity 编程语言快速入门教程(连载7)---C#OOP编程之多态性
- matlab与C#混合编程小例子
- C#与matlab混合编程
- MATLAB与C#混合编程