《c_调用matlab函数(混合编程)》由会员分享,可在线阅读,更多相关《c_调用matlab函数(混合编程)(12页珍藏版)》请在金锄头文库上搜索。
1、第第 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(参数错误); end addRlt=a
2、+b; minusRlt=a-b; end %- 两个输入参数,两个输出参数,并且都是矩阵形式 (2)在 matlab 命令窗口输入 deploytool,弹出如下窗口或者点击 matlab 的主菜单 desktopdeploy tool 获得如下面图所示的窗口, 然后在 filenewdeployment project 中点击。获得上图窗口,修改工程名称和 文件后缀名(必须是,.Net Assembly 格式)修改(3)新建了一个叫 matPrj 的工程(它相当于 c#中的命名空间 namespace) ; 然后给它增加 class 或类(它就是 c#中的类) ,点add class比如
3、myMathClass; 之后再给它添加方法(它就是函数了) ,点add files,如下图所示。本实例中给 它添加了 MatrixOpera 等函数。(4)完了之后就可以编译了。编译出来后需要一两分钟的时间。(5)找到该工程存放的文件夹,从里面拷出 matPrj.dll 文件。同时还要从 G:Program FilesMATLABR2009btoolboxdotnetbuilderbinwin32v2.0 拷贝出 MWArray.dll 和 ManagedCPPAPI.netmodule。第二个文件必须要哦,否则可能会class方法编译出错。2.1.2 c#添加添加 matlab 的的 dl
4、l 引用引用(1)打开 vs2008,新建一个窗体应用程序。(2)将刚才拷贝到的那 3 个文件一起放在 vs 工程(CallMatlabDllApp) 的 debug 文件夹下面。然后右键下图中的引用,选择添加引用,弹出一个窗口, 选择其中的浏览页面,分别添加 matPrj.dll 文件和 MWArray.dll 文件。右键,点添加引用已经添加了的引用(3)最后在前面,代码的前面添加下面的命名空间即可。using MathWorks.MATLAB.NET.Arrays;/在MWArray.dll,最常用的using MathWorks.MATLAB.NET.Utility;/ 在MWArray
5、.dll,最常用的using matPrj;/这个就是我们自己定义的,里面有matlab函数 如果 matlab 函数复杂,还需要用到其他的空间,则视情况而定,自己凭经 验添加。至此,已经可以利用 c#调用我们用 matlab 编写的函数了。2.1.3 函数调用函数调用函数调用前必须注意: (1)将 c#的参数输入到 matlab 函数时,要将参数转化为 matlab 的参数形已经添加了的引用式,通常是 MWArray 类型。 (2)matlab 返回的参数,也要转化为 c#用的类型,比如数组或者数值类 型。下面是关于(下面是关于(1)和()和(2)的介绍,从别人那拷过来的,具体可参考)的介绍
6、,从别人那拷过来的,具体可参考 http:/ 直接将值传递给已经初始化的 MWArray 数组中的成员 直接将数据类型赋值给已经初始化的 MWNumericArray 变量。 直接将字符串类赋值给已经初始化的 MWCharArray 变量。 如果是数组类型: 直接赋值给 MWNumericArray 变量; 赋值给 MWArray 变量,则在前面加上类型转换如:(MWNumericArray) 进行强制转换。 总之,MWArray 是总类型,其它的以 MW 开头,以 Array 结尾的变量类型 都可以直接对它进行赋值或取值。 M 类型到 C+/C#数据类型 MWArray M 类型,它是 M
7、文件的编译后内部的标准类型,一切 C+/C#类型都要最 终转换成此类型,方可作为参数调用 M 语言函数。 MWCharArray M 的字符串类型,使用它可以将 M 中的字符类型转换成 C+/C#的字符串 类型。 MWNumericArray MWNumericArray 是 MWArray 与 C#等语言的转换中间类型。常用的转换函数: public Array ToArray(MWArrayComponent component);将 M 类型转换成 C#的 Array 类型,然后可以直接转换成其它类型的数组。 public byte ToScalarByte();将 M 类型转换成 C#
8、的字节类型; public double ToScalarDouble();将 M 类型转换成 C#的双精度类型; double temp = (MWNumericArray)(mwArgout0).ToScalarDouble(); public float ToScalarFloat();将 M 类型转换成 C#的单精度类型; public int ToScalarInteger();将 M 类型转换成 C#的整型类型; public long ToScalarLong();将 M 类型转换成 C#的长整 C/C+/C#数据型类型; public short ToScalarShort()
9、;将 M 类型转换成 C#的短整型类型; public override string ToString();将 M 类型转换成 C#的字符串类型;string arror = mwArgout2.ToString(); public Array ToVector(MWArrayComponent component);将 M 类型转换成 C#的 Array 类型,然后可以直接转换成其它类型的数组。下面使用调试过的代码示例表述两个函数的区别: double, Temp1 = new double1,3; Temp1= (double,)(MWNumericArray)mwArgout1).To
10、Array(MWArrayComponent.Real); double s1 = new double2; s1 = (double)(MWNumericArray)mwArgout1).ToVector(MWArrayComponent.Real);(3)必须注意到多参数输入和多参数返回的问题。刚开始碰到这个这个问)必须注意到多参数输入和多参数返回的问题。刚开始碰到这个这个问 题比较头疼,后来经过不懈的努力,终于从网上找到答案。题比较头疼,后来经过不懈的努力,终于从网上找到答案。 声明这部分是我参考别人的想法自己写的额,网上百度知道也有我声明这部分是我参考别人的想法自己写的额,网上百度知道
11、也有我 (lwq123_321)回答的。)回答的。 /输入这里想传入的 2 个输入参数,为了支持矩阵好通用,所以得弄成 Arraydouble a = 1, 2, 3, 4, 5, 6 ;/输入参数 1double b = 2, 4, 6, 8, 10, 12 ;/输入参数 2double, c = new double3, 2;/输出参数 1double, d = new double3, 2;/输出参数 2 /这些参数都是矩阵MWNumericArray ma = new MWNumericArray(3, 2, a);/转换成 matlab 需求的格式MWNumericArray mb
12、= new MWNumericArray(3, 2, b); /输出参数是一个 MWArray 数组MWArray agrsOut = new MWArray2;/两个输出参数,一定要 写数量/输出几个输出参数可以是不同类型的,比如第一个元素是矩阵, 第二个是数值/同理,输入参数也是一个 MWArray 数组MWArray agrsIn = new MWArray ma,mb; /调用函数,输出参数需要加 ref 关键字myFun.MatrixOpera(2, ref agrsOut, agrsIn);/2 表示输入参数的个数,输出结构都在 argsOut 中, 类似于 c 的指针参数输入 /
13、转换得到实际的输出参数MWNumericArray x1 = agrsOut0 as MWNumericArray;MWNumericArray x2 = agrsOut1 as MWNumericArray;c = (double,)x1.ToArray();d = (double,)x2.ToArray(); /一定要注意最后 c 和 d 的转化,不同类型的转换差异很大厄 /ToArray()对应 n*m 的数组 /ToScalarDouble()对应单个数值 /ToVetor()对应 1 维数组到此,已经实现了 c#调用 matlab 函数的整个过程。第第 1 部分部分 他山之石可以攻玉
14、(别人的经验收集)他山之石可以攻玉(别人的经验收集)1.1 matlab 与与 c#接口的实现接口的实现http:/ 发现博客里上传图片特别的麻烦,以后可能就不再传什么图片上来了,都 放到相册里实在浪费空间。 一直以来,各系统之间如何实现互相通信都是非常重要也是最难解决的问 题,同时也是关系到一个系统设计成败的关键。我们这里所说的接口,也就是 系统与系统间交互的中间媒介或者说是数据转换器。 关于 matlab 与 c#之间一些数据类型的转换的方法,我也曾经写过。总结一 下,最主要的是要完成下面几个步骤: 1、同时安装.netframwork 与 MCR(matlab compile runti
15、me) 。这个在装完 与 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 的矩阵对应.n