当前位置:文档之家› c_调用matlab函数(混合编程)

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

同时还要从G:\Program Files\MATLAB\R2009b\toolbox\dotnetbuilder\bin\win32\v2.0拷贝出MWArray.dll和module。

第二个文件必须要哦,否则可能会出错。

2.1.2 c#添加matlab的dll引用(1)打开vs2008,新建一个窗体应用程序。

(2)将刚才拷贝到的那3个文件一起放在vs工程(CallMatlabDllApp)的debug文件夹下面。

然后右键下图中的引用,选择添加引用,弹出一个窗口,选择其中的浏览页面,分别添加matPrj.dll文件和MWArray.dll文件。

(3)最后在前面,代码的前面添加下面的命名空间即可。

using .Arrays;//在MWArray.dll,最常用的using .Utility;// 在MWArray.dll,最常用的using matPrj;//这个就是我们自己定义的,里面有matlab函数如果matlab函数复杂,还需要用到其他的空间,则视情况而定,自己凭经验添加。

已经添加了的引用至此,已经可以利用c#调用我们用matlab编写的函数了。

2.1.3 函数调用函数调用前必须注意:(1)将c#的参数输入到matlab函数时,要将参数转化为matlab的参数形式,通常是MWArray类型。

(2)matlab返回的参数,也要转化为c#用的类型,比如数组或者数值类型。

下面是关于(1)和(2)的介绍,从别人那拷过来的,具体可参考/share/detail/294982直接将值传递给已经初始化的MWArray数组中的成员直接将数据类型赋值给已经初始化的MWNumericArray变量。

直接将字符串类赋值给已经初始化的MWCharArray变量。

如果是数组类型:直接赋值给MWNumericArray变量;赋值给MWArray变量,则在前面加上类型转换如:(MWNumericArray)进行强制转换。

总之,MWArray是总类型,其它的以MW开头,以Array结尾的变量类型都可以直接对它进行赋值或取值。

M类型到C++/C#数据类型MWArrayM类型,它是M文件的编译后内部的标准类型,一切C++/C#类型都要最终转换成此类型,方可作为参数调用M语言函数。

MWCharArrayM的字符串类型,使用它可以将M中的字符类型转换成C++/C#的字符串类型。

MWNumericArrayMWNumericArray是MWArray与C#等语言的转换中间类型。

常用的转换函数:①public Array ToArray(MWArrayComponent component);将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。

②public byte ToScalarByte();将M类型转换成C#的字节类型;③public double ToScalarDouble();将M类型转换成C#的双精度类型;double temp = ((MWNumericArray)(mwArgout[0])).ToScalarDouble();④public float ToScalarFloat();将M类型转换成C#的单精度类型;⑤public int ToScalarInteger();将M类型转换成C#的整型类型;⑥public long ToScalarLong();将M类型转换成C#的长整C/C++/C#数据型类型;⑦public short ToScalarShort();将M类型转换成C#的短整型类型;⑧public override string ToString();将M类型转换成C#的字符串类型;string arror = mwArgout[2].ToString();⑨public Array ToVector(MWArrayComponent component);将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。

下面使用调试过的代码示例表述①⑨两个函数的区别:①double[,] Temp1 = new double[1,3];Temp1=(double[,])((MWNumericArray)mwArgout[1]).ToArray(MWArrayComponent.Real);⑨double[] s1 = new double[2];s1 = (double[])((MWNumericArray)mwArgout[1]).ToVector(MWArrayComponent.Real);(3)必须注意到多参数输入和多参数返回的问题。

刚开始碰到这个这个问题比较头疼,后来经过不懈的努力,终于从网上找到答案。

声明这部分是我参考别人的想法自己写的额,网上百度知道也有我(lwq123_321)回答的。

//输入这里想传入的2个输入参数,为了支持矩阵好通用,所以得弄成Array double[] a = { 1, 2, 3, 4, 5, 6 };//输入参数1double[] b = { 2, 4, 6, 8, 10, 12 };//输入参数2double[,] c = new double[3, 2];//输出参数1double[,] d = new double[3, 2];//输出参数2//这些参数都是矩阵MWNumericArray ma = new MWNumericArray(3, 2, a);//转换成matlab需求的格式MWNumericArray mb = new MWNumericArray(3, 2, b);//输出参数是一个MWArray数组MWArray[] agrsOut = new MWArray[2];//两个输出参数,一定要写数量//输出几个输出参数可以是不同类型的,比如第一个元素是矩阵,第二个是数值//同理,输入参数也是一个MWArray数组MWArray[] agrsIn = new MWArray[] { ma,mb};//调用函数,输出参数需要加ref 关键字myFun.MatrixOpera(2, ref agrsOut, agrsIn);//2表示输入参数的个数,输出结构都在argsOut中,类似于c的指针参数输入//转换得到实际的输出参数MWNumericArray x1 = agrsOut[0] as MWNumericArray;MWNumericArray x2 = agrsOut[1] as MWNumericArray;c = (double[,])x1.ToArray();d = (double[,])x2.ToArray();//一定要注意最后c和d的转化,不同类型的转换差异很大厄//ToArray()对应n*m的数组//ToScalarDouble()对应单个数值//ToVetor()对应1维数组到此,已经实现了c#调用matlab函数的整个过程。

第1部分他山之石可以攻玉(别人的经验收集)1.1 matlab与c#接口的实现/lemonfamily/article/details/1497527发现博客里上传图片特别的麻烦,以后可能就不再传什么图片上来了,都放到相册里实在浪费空间。

一直以来,各系统之间如何实现互相通信都是非常重要也是最难解决的问题,同时也是关系到一个系统设计成败的关键。

我们这里所说的接口,也就是系统与系统间交互的中间媒介或者说是数据转换器。

关于matlab与c#之间一些数据类型的转换的方法,我也曾经写过。

总结一下,最主要的是要完成下面几个步骤:1、同时安装.netframwork与MCR(matlab compile runtime)。

这个在装完 与matlab以后,前面2个组件也就安装好了。

2、利用matlab自带的.nettool工具将.m文件转换成.net组件--->.dll文件为接口,它实际上不含任何实现,都是调用另一个.ctf文件来完成具体的功能。

3、在c#中,必须引入mwarray.dll才能拥有在.net中进行矩阵运算所需要的一切。

虽然matlab help中只是说推荐,但一般的应用中,只是进行一部分函数的调用,而不是去取得整个运行结果。

这个.dll是必须引入的。

有时mclmcrrt74.dll 这个文件也需要引入。

根据具体的要求,需要引入的文件也有所差别。

4、生成一个实例,并对.net组件所输出的结果进行数据类型的转换,以符合.net编程环境中对数据类型的要求,这个在以前我已经讲过,这里就不再多说了。

关键是掌握如何把一个矩阵(在matlab中,一个m*n的矩阵对应.net中的一个1*(m*n)的数组)转换成数据类型一致的数组。

相关主题