C#与MATLAB混合编程
C#和MatLab的混合编程,充分利⽤了winform的直观显⽰和matlab的强⼤计算能⼒。在此以⼀个⼩例⼦的形式给⼤家讲述⼀下⼆者混合编程的实现。
⼀、软件的配置说明
C#版本:VS2010 matlab版本:matlab2013a
⼆、把 matlab函数编译成dll⽂件
2.1⾸先写⼀个函数的.m⽂件(如下函数Matrix实现两个矩阵的相加和相减)
%--------------------------------------------------------function [addRlt,minusRlt]=MatrixOpera(a,b)% 矩阵相加,相减[m1,n1]=size(a);[m2,n2]=size(b);if m1~=m2 || n1~=n2 display('矩阵⼤⼩不相同') error('参数错误');endaddRlt=a+b;minusRlt=a-b;end%----------
2.2 创建制作的dll⽂件的⼯程
在MatLab的命令窗⼝中,输⼊deploytool打开创建dll⽂件的⼯程创建窗⼝,如下图所⽰
在图中,主要分为三部分,Name:你想要命的⼯程名,j是⼯程的后缀;Location:创建⼯程的储存位置;Type:针对c#⽽⾔,我们需要选择.NET Assembly这⼀项
点击Ok选项,⼯程已经创建完毕
2.3 向所建⼯程中添加对应的元素并编译
上述过程中,新建了⼀个叫matPrj的⼯程(它相当于c#中的命名空间namespace);然后给它增加class(它就是c#中的类),点[add class]添加myMathClass;之后再给它
添加⽅法(它就是函数了),点[add files],本实例中选中之前编写的MatrixOpera函数。完了之后就可以编译了,编译需要⼀两分钟的时间,如下图所⽰
三、C#中添加matlab的dll引⽤
3.1打开vs2010,新建⼀个窗体应⽤程序
3.2完成dll⽂件的拷贝
将matlab⼯程(matPrj)src⽂件夹下的matPrj.dll和D:\Program Files\MATLAB\R2013a\toolbox\dotnetb
uilder\bin\win64\v2.0(前边为matlab的安装路径)⽂件夹下的MWArray.dll
拷贝到VS⼯程(CallMatlabDllApp)下的\bin\Debug⽂件夹下
3.3在VS⾥添加dll⽂件的引⽤,然后在代码前引⽤相应的命名空间
如果matlab函数复杂,还需要⽤到其他的空间,则视情况⽽定,⾃⼰凭经验添加。
⾄此,已经可以利⽤c#调⽤我们⽤matlab编写的函数了。
四、在C#中调⽤matlab提供的函数
matlab中⼀个m*n的矩阵对应中的⼀个1*(m*n)的数组,因此在C#中调⽤matlab函数的关键是掌握数据类型⼀致的⼀个矩阵与⼀个数组之间的转换。包括以下两个问
题:
a、将C#中的参数输⼊到matlab函数时,要将参数转化为matlab的参数形式,通常是MWArray类型
b、matlab函数返回的参数,也要转化为C#⽤的类型,⽐如数组或者数值类型
在C#中调⽤本例函数的代码如下:
MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进⾏赋值或取值,它是.m⽂件的编译后内部的标准类型,⼀切C#类型都要最终转换成此类
型,⽅可作为参数调⽤matlab函数
我在运⾏上述程序时,第⼀句将myMathClass类实例化报错
但是单看这语句是没有任何问题的
vs编程软件 MathClass test = MathClass();
查阅了关于错误的信息,但是解决的都基本是换了⼀个matlab版本才解决的,偶然看见说HRESULT:0x8007000B的错误和编译平台有些关系,就开始着⼿试试是不是因为
我这平台的问题导致的,果然,换了编译的平台就好了。
具体解决:
1:右键项⽬名称—>属性—>⽣成
2:⽬标平台选择x64(因为我的matlab2013a是64位的)
再次运⾏程序,结果如下:
上述结果同下图在matlab中实现效果相同,验证结果的正确性
由于我的项⽬中其他引⽤是32位软件⽣成的,为保重整个系统的各个模块能同时⼯作,我重下了个32位的matlab2012a重新⽣成dll⽂件实现同样的功能,C#项⽬程序不变,
⽬标平台改回x86(同时因为通常情况下,为保证我们的程序既能在64位机⼦上运⾏,也能在32位机⼦上运⾏,我们的⽬标平台也会选择x86),重复上述步骤进⾏操作,发现最
后运⾏程序时再⼀次出现与之前相同的错误
很明显还是matlab版本的问题,但我的C#项⽬的⽬标平台已经是x86,上⽹查各种资料,有的说是因为matlab中被编译的.m⽂件和编译⽣成的⼯程所在路径上有中⽂,改之,问题未解决;有的说要重
现装⼀下MCR(MATLAB Compiler Runtime),装之,问题未解决;有⼈接着说装完MCR后还要把他的路径增加到环境变量path中,加之,问题未解决(后来发现这些做法根本就是多此⼀举,系统安装matlab时就已经安装了MCR,⽽MCR在安装成功后,路径会被系统⾃动添加到环境变量中)。加上反反复复的安装和卸载matlab共花费了⼤约2~3天的时间,问题仍然没解决,正当我对⼈⽣充满疑惑时,⼀次偶然的机会(直接运⾏打包后的程序),我看到了错误的信息是matlab引⽤与配置⽂件信息(2.13.0.0)不相符,我马上到了⼯程下的配置⽂件fig,打开后果然发现⾥边的配置信息有2.13.0.0的字眼,这很明显是我最开始使⽤matlab2013a与C#混编时⾃动写⼊的,⽽现在我换成了matlab2012a,与配置⽂件中的版本信息不相符,所以报错,到了问题所在,就容易解决了:把fig中matlab版本信息2.13.0.0改成
2.12.0.0,问题解决!
脱离matlab安装的环境下,如何实现程序的运⾏⾃如:
通过com组建的形式进⾏混合编程,如果机器上没有安装MATLAB,编译⽣成的软件照样可以使⽤,但是需要安装MATLAB提供的MATLAB Compiler Runtime(MCR),这个软件在MATLAB的安装⽬录下:X:\MATLAB\R2013a\toolbox\compiler\deploy\(X是MATLAB安装的盘符),如果你的电脑上安装了MATLAB,则不需要在重新安装这个软件。另外,不同的MATLAB版本
提供的MATLAB Compiler Runtime可能会不同,如果在另⼀台电脑上⾃⼰编写的软件运⾏有问题,可能是编译器的版本不同引起的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论