已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2部分 实战练习(自己做的)2.1 c#调用matlab函数matlab版本2009b,c#版本vs200 matlab函数编译成dll文件(1)首先编写一个函数的m文件,如MatrixOpera表示两个矩阵相加和相减。%-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)在matlab 命令窗口输入deploytool,弹出如下窗口或者点击matlab的主菜单 desktopdeploy tool获得如下面图所示的窗口,然后在filenewdeployment project 中点击。获得上图窗口,修改工程名称和文件后缀名(必须是,.Net Assembly格式)修改(3)新建了一个叫matPrj的工程(它相当于c#中的命名空间namespace);然后给它增加class或类(它就是c#中的类),点add class比如myMathClass;之后再给它添加方法(它就是函数了),点add files,如下图所示。本实例中给它添加了MatrixOpera等函数。方法class(4)完了之后就可以编译了。编译出来后需要一两分钟的时间。编译(5)找到该工程存放的文件夹,从里面拷出matPrj.dll文件。同时还要从G:Program FilesMATLABR2009btoolboxdotnetbuilderbinwin32v2.0拷贝出MWArray.dll和ManagedCPPAPI.netmodule。第二个文件必须要哦,否则可能会出错。2.1.2 c#添加matlab的dll引用(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.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)(mwArgout0).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 = mwArgout2.ToString(); public Array ToVector(MWArrayComponent component);将M类型转换成C#的Array类型,然后可以直接转换成其它类型的数组。下面使用调试过的代码示例表述两个函数的区别:double, Temp1 = new double1,3; Temp1= (double,)(MWNumericArray)mwArgout1).ToArray(MWArrayComponent.Real);double s1 = new double2; s1 = (double)(MWNumericArray)mwArgout1).ToVector(MWArrayComponent.Real);(3)必须注意到多参数输入和多参数返回的问题。刚开始碰到这个这个问题比较头疼,后来经过不懈的努力,终于从网上找到答案。声明这部分是我参考别人的想法自己写的额,网上百度知道也有我(lwq123_321)回答的。/输入这里想传入的2个输入参数,为了支持矩阵好通用,所以得弄成Array double a = 1, 2, 3, 4, 5, 6 ;/输入参数1 double b = 2, 4, 6, 8, 10, 12 ;/输入参数2 double, c = new double3, 2;/输出参数1 double, d = new double3, 2;/输出参数2/这些参数都是矩阵 MWNumericArray ma = new MWNumericArray(3, 2, a);/转换成matlab需求的格式 MWNumericArray mb = 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的指针参数输入/转换得到实际的输出参数 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部分 他山之石可以攻玉(别人的经验收集)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)的数组)转换成数据类型一致的数组。目前所有的matlab数据类型(无论什么类型,都可以把它看成一个矩阵,这样就可以利用数组的思想来思考)都可以进行转化,具体的可能需要经过实验才能符合各自的要求。虽然matab对.net的支持不如它对c+支持的功能强大,但也已经满足了我们实际应用的需求。如果我们可以把大部分的运算都放在matlab里面完成,数据转换的数量又少,那么整个系统的运行速度与效率还是挺高的。1.2 关于matlab与c#混合编程产生的移植问题/lemonfamily/article/details/1497528这个问题曾经差点让我的毕业设计的程序没办法拿出去演示。其实这也是个很现实的问题,你做好的程序如果不能在别人的机子上运行,那么它有什么应用价值呢?说来也惭愧,我以前编写过很多的程序都出现过移植性难的问题。我想一个很主要的原因是在一个程序开发者使用的机子上,往往是具备了非常完整的软件运行环境,但程序运行时有可能需要调用外部的程序或函数,这些平时我们可能不会去注意。也就造成软件发布时移植性问题产生的根源了。matlab与c#混合编程的程序,如果要运行于客户的机子,必须在客户端的机子上设置好系统变量,同时需要安装.netframwork与MCR。.netframwork大家都很熟悉了,任何一个.net设计出来的程序,都不能脱离.netframwork而独立运行,正如用vc+设计的程序离不开MFC一样。这个是必须安装的。独立的.netframwork组件包可以直接去微软的网站上去找。MCR是由matlab提供的,它和.netframwork的性质相同,任何一个运行matlab的电脑上,都必须安装该组件。该组件在matlab2006a版本中已经分离开而成为一个独立的可运行的.exe文件。它一般是放在 /MATLAB/R2006a/toolbox/compiler/deploy/win32文件夹中,名为 MCRInstaller.exe。该组件其实是将/MATLAB/R2006a/bin/win32文件夹下的大部分(注意不是全部).dll文件打包而已。这也是为什么有些程序在安装了MCR的机子上仍然不能运行的原因,不过对绝大多数的程序来说,一个MCR就足够了。比较保险的办法是,自行将/MATLAB/R2006a/bin/win32下的所有文件打包成一个安装文件,安装完后设置好系统变量(也就是在class变量下添加上面文件的路径)。为了让用户安装程序时不需要太多的操作,我们可以把上面2个组件和应用程序一起打包,然后写个脚本检测客户端的机子是否已经安装了上面的2个组件,如果没有,则提示用户安装。检测脚本的写法很多地方都可以找到。这里就不多介绍了。1.3 使用转换心得1.3.1 使用把matlab的dll放到bin或者应用程序目录里,添加项目引用. 然后参考该类库的文档,在类里引用matlab的命名空间 装matlab ,添加引用VB。Net Matlab = CreateObject(matlab.application) MatLab.MinimizeCommandWindow() strMatLab = t=2:0.2:4*pi;y=sin(t);plot(t,y) /这只不过是一个例子,求特征值的string要自己查 MatLab.Execute(strMatLab) /t/20040621/19/3111008.html1.3.2 矩阵转换示例 用于将matlab的返回值矩阵传递到C#规范的矩阵中 MWArray ResOut = null; /用于值输出的matlab矩阵 ResOut=GTN.GetMatchNo(1,MainAdd, ModelAdd, FName.GTM(), Vaval); MWNumericArray temp = (MWNumericArray)ResOut0; /矩阵转换 Array netInterfaceMatrix = temp.ToArray(MWArrayComponent.Real); /c#规范的矩阵 double, location = (double,)netInterfaceMatrix; /变态的强制类型转换 http:/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025成都辅警考试真题及答案
- 安全运输策划方案结论
- 校园内安全常识课件
- 市妇幼保健院权利清单管理制度
- 机械设计基础模拟考试题及答案详解
- 建筑工地高处作业安全防护措施详解与实操试题集
- 开学文化测试易错题目及答案详解
- 篮球实战技巧训练题集与答案详解
- 健康饮食计划测试题目和答案
- T∕SAASS 273-2025 滨海盐碱地大豆水肥一体化栽培技术规程
- 食品营养学(暨南大学)智慧树知到答案章节测试2023年
- 传感器原理与应用智慧树知到答案章节测试2023年山东大学(威海)
- 普通硅酸盐水泥-硫铝酸盐水泥复合胶凝体系混凝土的性能研究
- 连续性肾脏替代疗法
- 1.工程建设前期法定建设程序检查表GD1701
- 钢结构加工安装合同 钢结构构件加工合同(3篇)
- GB/T 16674.1-2004六角法兰面螺栓小系列
- 涡轮风扇发动机原理
- 中药材的采收与产地加工课件
- 运动前评价课件
- 我国玉米深加工产业概述课件
评论
0/150
提交评论