Matlab与C#混合编程_第1页
Matlab与C#混合编程_第2页
Matlab与C#混合编程_第3页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Matlab与C#混合编程的实现关于matlab与c#之间一些数据类型的转换的方法,我也曾经写过。总结一下,最主要的是 要完成下面几个步骤:1、 同时安装 framwork 与 MCR matlab compile runtime。这个在装完与 matlab 以后,前 面 2 个组件也就安装好了。2、 利用 matlab 自带的 tool 工具将 .m 文件转换成组件 -.dll文件为接口, 它实际上不含 任何实现,都是调用另一个 .ctf 文件来完成具体的功能。3、 在c#中,必须引入才能拥有在中进行矩阵运算所需要的一切。虽然matlab help中只是 说推荐,但一般的应用中,只是进行一局

2、部函数的调用,而不是去取得整个运行结果。这个.dll 是必须引入的。有时这个文件也需要引入。根据具体的要求,需要引入的文件也有 所差异。4、生成一个实例,并对组件所输出的结果进行数据类型的转换,以符合编程环境中对数据类型的要求,这个在以前我已经讲过,这里就不再多说了。关键是掌握如何把一个矩阵在matlab中,一个m*n的矩阵对应中的一个 1* m*n的数组转换成数据类型一致的数组。 目前所有的 matlab 数据类型无论什么类型,都可以把它看成一个矩阵,这样就可以利用 数组的思想来思考都可以进行转化,具体的可能需要经过实验才能符合各自的要求。虽然matab对的支持不如它对 C+支持的功能强大,

3、但也已经满足了我们实际应用的需求。 如果我们可以把大局部的运算都放在 matlab 里面完成,数据转换的数量又少,那么整个系 统的运行速度与效率还是挺高的。c#与matlab混合编程图解using System;usingusing ;using ConsoleApplication1class Program static void Main(string args)Program p = new Program();();( 按任意键退出 .);();ET 库 );dt = new ();( 完成 );, ();imiw|P W 方 LamsB4】価卜 吨0卜 fmaK* K * 9 wT

4、1t;Sl i K-itapu wJ J、o 2 e i px 呷,rj、叩UQZE &rruTN22 2丄&牛讥:阿G = 3uisa -职 p 04-t = utsn 20“3S吓口 ;于咛丐Q00!評吁“imp |4vH 时伽1sndbi YYB * 匕01 e*w%OQ$zu art: w :x“ :ld-IIIM:aXV2CD3H011吃、:】epxnj s 啊Tltf 缈壮 IE犷:w xo nxTiTt2?irr 01: 101 xwti-lo d“q Qip ?(j 严1!$口05列 打叭1 叫qo |tiij.xourqo Uljnoc j 9ioarLQ( tiundo u

5、oipJosalvQPWWU/Qp忙EHiy pg“ a ss二 “厶 vq型二八 f3M 沖叩 6V:;VJ vf P5& acivy h PT fprivy wju j机 “ oregm恤TO S ztl2q壮世in坟少:2: 中!程 pAAl* 4A. 4u-厂qgcoavirAi oW l;B|UJJH EIU 3 DO皿 HUJ |0|(Uu . 3曲2畑匸iu ppeXiu r IIHNPQ O /w*id inBMgnf 矶a:Tpi曾 t 吃eye K-e j(一 2l:2dt_ YY 一* ,一 91丸金出YYO Ti*PIW pfTnqii :Crw looxxau dn“

6、 poAU|op - dn pouion、一肥订二 -6划-%-eE3ly dsj nxj dcxnar,厂3n=MOaqi sn7WC3乙 s r | K .,.厂曰口vf Jtt,nan ff时im血 i;0iuiun 山 |50|A|SW 8|)01AU tu |O|dXu lUiJJ62|Xu iu ppeXiupupnpocr Id inc小d W3jVUWg5K0 :P :X)X4Q|& 旧*;0& 貿apKvp“TI 血那么“门 hid: 九t&q,【g】 八门 *;iitile Mi Ice】? Jrj*e P*hn lv411l Q*iW t 址2办 Jfelp J * *

7、刁十 & C IT ft -A -D 2 i W x 节| ?U1 Pili ;二 myadd e *1 fnyfzerc.rr 二.tnyplolfn ttfnyrotl&m 、Mytod m i Jr 1 led prji :.nbuxLd 5etw)nbuild卜川一妙3下午2H6 -S 43 下午2H7 二 占CO-S-3下午力% rubuildW:t*G? sst Htt 另二佃QE. J旻方机S Cid! .| SK | y fwreae | 6 D?.“4私丫3ATUIB2-6*YaJLVtile Wit2r0j*et 0*huc I trail el Qeslrt q MN J

8、fclp 1 M Q ?CwreM Direorx: |d: 5er qoWIAB fhorCTJls L K:v t: A44 刊 Yhit s 5wCwrert Dixccterr?-JjDmNdmtFolder二 nyadd mfAiilepm邈盹二nyplot mM-filellmyrothmM-fitoQ Mytod mIVMfe1 Jrnle:! prjPRJFill PE 2|7yy.11 I2J?一血43下午1:58 COTtOOl :厂 Up lot net-tool setup n&TTool -setup:nboxLd stwpnbuildCCHA3 下午2订 6 :K一

9、 CO-J 下午2: K (hw CO-S-3 下午力M rebuild Uablodhtf 联 pr (. KT Corc.nt 匕 *LJ UtlCDotlQ th:; t Jy :r * I nyfzro.ftE:,i aUTLAB|nr ts.; Cj NSdst Tart $ Cell Ts&ls 二abyY:dc% Kai?乡刁【勺3 b 忙化|习1幻Q三1 pr三|W G h I * tj 其 | 说 7! & t oa X- Ho cl t tl* t zUV I *i 4oy 4 - r = roots (c :eyre“te|爭、疔机I ./ Cm,olU3 STK 鼻|

10、U/ feme ft br|QZ 多 is:ATLAB日“ Mgrswlr411el Qeski rp Wd Jfclp鼻刁c|搽& U FT, Oirertcrx! &:53、汕73 | !Sh&rtCTits A K:v tc A44 Yhit s 5w一IB.I yulxm tjj B x 沁1 ?卜3 MatlQ:oUht【供 pr j (. F2T Cooc4nUCrr*nt Ilir rclery 口 * ir 針分、ael Slo4i ejDftt4(i) Vixed Flat tort 5吐咯匕M三丨言旦制*冥丄二卄、g參91 氏.S】.4.7*5“存诗计伍時昱rxlLAB m

11、n Ar tt JRU4irSb = 4t pro, Q):石澤MSB丄 iu. rid - (IHi*thyutkkBnag l.A 胡刃3 in reaLf tret ch (dwble审悍腔8?atriag :t f erch tdwblf)iniricinarypirt *= i *n - ri teLme G-r*=u L P-P-*Q13sCTLnrR 卜? Lu A44 丄 Yhpc cr; =-;2wj 口弋 -r& ,虫03$; EoleH丹Be JfJS 匕 HR0 馬AM DPM-?eJD%L二*Med nla-r.sIllisL is b 須lfel 口戸?-5:4兀也

12、器节,v5:tta.c.lsmoqu q 一 0Autorks Ecw yzT Arrrr:3nrIE nn F、r5)m2*】Ll1N b H de 7rc2u色二F::c丨m? :alwlu-鼻 7T:rhs?rdbl:F:SWBrx (3二才 .!- p EgJ gnryp*rk &rc:r d;-lcip6rypq-r :E JJqs阳;r;L?n2三- A: - erTV!5Hll&uwcokNclcAPJUd 茧.斤令 $ 丁 !:?:.-L -3osd5 rts5 0 -LWM-i 乞 ft7ocr9czm.EjDpr殳EriQ5: 【ootrvn.7hnc Z4匕一匕TSTG

13、h:d=s 3.2 D-re FrxTlm 0?o WHABXc:orAPrs& 1 3倏曰 deHn 晝HJ8 IReDrdcJ?* 三*Med nlar:Fr.cr aa cz_AUJwks IVJSy3Tbm3nr;rcricArTQ ddxh/orks-FXTLAJ 1ST Art-? VY1M erucAJrwd l,2di-tl!Jsc【sz:- : -SG.0=4t&i+tt萍潮 yFOIE nn Ar;、r尹*1卸亍5?、rE.r Met I LslahYd (r : IdwBr* .JCMJ ror:rhS?r4bl: ir realX? : 3&Bry .- pct*-f

14、n r yp *r k fwch tdewz:3二运:m;r- &TU -.?: &?并?-5:4|加诵F.5:ttIM Ffe*44t co:十唇L.d 02.oopoo公 gO O O O O nJ 9丄:L2 2 IU POO bob o O Q3S3 0 UAO0 550 50 52m 5 70e FeLys75er2;s * 宀 cnicl;nr11区i!acss IZXES5a$:ybl rrGr.d:yqowx* 了 ?TQUS. Xi- *q2s.L EC Lfny- lcrm02Hn ycrooM*wg -cr:0=9一 *cr 益S.QL-l-nvqg-gFix7h%omk

15、_7E,Eil 二E vd匕JJtarp_2M 3:k ?:?ACL AmmLoliMwb&ck1 J2 2 2 i - 3 3 o o o e oooooo *Ls上A 0 59T2P5Q- l&igs 一 0 w0 5q0 5F- e 丁pc:.-Lo321o 3rvvrtsjru*n mmj? d,o Sm9-O-?$ b- c dD三匸5* 一;文件 iRWqp IMS 畑也 車如 an IX) IjA 刚4IR ntjDftt4|L)XI|,JCoglAlizy P“Q u2J |.vnuaTtst 0f dair arY:y 乂 7&l4:rx - -(匚5正衽瓮入(】b for

16、KET庠 *).DeiKtT*l Bo(* Sjntm QSrzts.D 吠a二-lJ SfsttfM. Xrd. 2* Pt 吟 5 “jl niirtrr/NwihYerki MATUB JOT! U八山叩 4 / Hr i rArr y/ L dneatioa, HthYorks MATLAB XET Vrys. VArTaXnplrxi ty 弘匚 :n*ntjcn)肌,hwk? ,/JLAB E 忙 代仆 i,4 VA7(AB DT Atb VYW、,M4:心:e. Am匕:恥 幵如厂輕M -;0H*. d 7oSb5y():VaikR or in PaILaB. U?T. Ar r

17、 wv R?A; r ft ilWJcHi i5iMi*Sfb = 4t przh (d): / *n.c rl = (41thYoUs 1HLAE 3T7 Arrays. T xaix: .: *)h).7;Arr 7iHut?.Yck5. YATLKB ICT Arr irt *faraarh (dMdile i in r.aL)reedfrt i Qirtaonery s*t = i * H: I ., iium*rx - (iNwthYurkK ATLaB MTI Ur evii. *.* A . Oi) ToAir x Qlth/*rki VXIA MtT At r Yz wlrsa

18、 sa tn mooary)J於卜23才嘉妄i5E器.g 匚ujn_d 岁计算机首呷 _|i-zcn. 1.:?ff 63列 ICh 1BlA4l8 / f tre MATLABBuilder NE - Generic COM Component2) 添加相应的M文件3) 保存,编译4) 新建C#工程,添加Referenee. Ok4. 使用 Matlab DeployTool 生成.Net 组件1) 选择 New Deployment Projeet - MATLAB Builder NE - .Net Component2) 添加相应的M文件3) 保存,编译4) 新建C#工程,由于经常要u

19、singusing 因此需添加 MWArray这个 Referenee , 般安装玩 MATLAB Builder NE 就有了,放在GAC当中的骤deployme nttoolstarmatlabMatlab Builder新建Matlab Builder forfor.Netcomponent右键 add file找目标 M文件编译VS2005引用:弓I用编译的dll ,同时保持*ctf在同一文件夹下usingusing 习匚test = n ew();MWNumericArray是MWArray和c#中数据的中间类,怎么用怎样在 C#W matlab间传递参数?型、int型等数值类型的变

20、量传递MWNumericArray i = n ull, result = mydouble;i=4;myClass myclass = new myClass(); 符串(需要用到 MWCharArray和 MWArray 转换)MWCharArray FileName = myStri ng;MWNumericArray sen sitivity;sen sitivity = (MWNumericArray)(MWArray)FileName);c.多个输出参数组成的数组MWNumericArray out_Arr = (MWNumericArray)out_Args1; oScalarD

21、ouble();如上面例子ToScalarDouble 一类的toXXXX等方法还有许多。可以把matlab返回的矩阵变成C#的n x m数组,eg:double, csArray= (double,);e.将数组传入Matlab(和传递单个数值的方法一样)double, dbx = new double2, 2 1,2 , 3, 4 ;MWNumericArray x=dbx;(x);M文件如何接收和返回fun cti on x=test(h,d) et方式连接,以下为COM方式连接(编译速度而言的方式要快上很多,而且似乎比拟稳定)matlab编译工作 -mbuild -setup -dep

22、loytool , Matlab Builder for ,Generic COM Component -添加 m函数文件(eg:,改类名(eg: myComClass),build注册dllregsvr32regsvr32VS2005调用:-Referenee 力卩 Com空件-调用例如double, arr = n ull;object in_a, out_a;in_a = 500;out_a = arr1;mc = new ();(1, ref out_a, in _a);小例子:(提取matlab返回的两个参数并转化为 C#的矩阵)st =n ew();MWArray max = (

23、2);MWNumericArray x1 = (MWNumericArray)max 0;MWNumericArray x2 = (MWNumericArray)max 1;double , locati on1 = (double ,);double , locatio n2 = (double ,);=location11,2.ToString();其中的M文件:EQfun ctio n x1,x2=testz()x1=1 2 3;4 5 6;7 8 9;x2=9 8 7;6 5 4;3 2 1;关于 matlab 与 c# 混合编程产生的移植问题 R 这个问题曾经差点让我的毕业设计的程序

24、没方法拿出去演示。其实这也是个很现实的问题, 你做好的程序如果不能在别人的机子上运行, 那么它有什么应用价值呢说来也惭愧, 我以前 编写过很多的程序都出现过移植性难的问题。 我想一个很主要的原因是在一个程序开发者使 用的机子上, 往往是具备了非常完整的软件运行环境, 但程序运行时有可能需要调用外部的 程序或函数, 这些平时我们可能不会去注意。 也就造成软件发布时移植性问题产生的根源了。 matlab 与 c# 混合编程的程序,如果要运行于客户的机子,必须在客户端的机子上设置好系 统变量,同时需要安装 framwork 与 MCR。framwork 大家都很熟悉了,任何一个设计出来的程序,都不能

25、脱离 framwork 而独立运行, 正如用vc+设计的程序离不开 MFC一样。这个是必须安装的。独立的framwork组件包可以直接去微软的网站上去找。MCR是由matlab提供的,它和framwork的性质相同,任何一个运行matlab的电脑上,都必须安装该组件。 该组件在 matlab2006a 版本中已经别离开而成为一个独立的可运行的 .exe 文件。它一般是放在 MATLABR2006atoolboxcompilerdeploywin32 文件夹中 , 名为。 该组件其实是将 MATLABR2006abinwin32 文件夹下的大局部 注意不是全部 .dll 文件 打包而已。这也是为

26、什么有些程序在安装了MCR的机子上仍然不能运行的原因,不过对绝大多 数 的 程 序 来 说 , 一 个 MCR 就 足够 了 。 比 较保 险 的 办 法是 , 自 行 将 MATLABR2006abinwin32 下的所有文件打包成一个安装文件, 安装完后设置好系统变量 也就是在 class 变量下添加上面文件的路径 。为了让用户安装程序时不需要太多的操作,我们可以把上面2 个组件和应用程序一起打包,然后写个脚本检测客户端的机子是否已经安装了上面的2 个组件, 如果没有, 那么提示用户安装。检测脚本的写法很多地方都可以找到。这里就不多介绍了。Matlab和C#混合编程初探最近很想把Matla

27、b中对图像处理的结果,在 C#应用中显示出来。因此涉及到Matlab和C#的混合编程问题,经历一番折腾。简单的测试程序终于通过了,期间涉及各种配置和调用问题。某些步骤的具体原因,尚没有研究明白,但是通过下面的流程是可以成功实现在C#中调用一个十分简单的 Matlab函数的功能,希望在以后学习中,可以在 C#中调用更多的 Matlab功能。本文用 Windows Live Writer 编写,也顺便测 试一下,呵呵!1、Matlab (R2021a)版本)中新建文件fun ti on result = dlldemo(i nput);result = 2 * in put;end2、在 comm

28、and window中配置分别配置 mbuild - setup 和mex - setup,编译器均选择 VS2021 SP13、在command window中 deploytool会弹出如下对话框按照提示的流程,先创立 project ,选择.NET Component类型;然后把文件添加到project里面,然后点上面菜单条上的 build the project成功后会在刚刚选定的project文件夹下出现两个文件夹,在distrib文件夹下有我们需要的4、 接下来需要做的是,查看distrib 文件下的readme首先需要安装,它所在的位置是:Matlab的安装目录toolboxco

29、mpilerdeploywin325、 我们还需做一个准备工作,在命令行中进入/ bin/win32 目录下matlabroot 为matlab安装的路径,输入regsvr32 ,即对进行注册这个dll是matlab下作的任何com组件都要用到的dll,下面我们在其他编译器下调用时就可以用了6、在 c#中简单做一个 windowsapplication点击Calculate 按钮后,代码是:private void button1_Click(object sender, EventArgs e) Dlldemo mydlldemo = new Dlldemo();int i = 3;MWAr

30、ray result;result = (MWArray)i);开始对MATLAB个软件是窍不通,不过还好,这个软件的语言和 C语言差不多,很简单因为我不是要精通它,只是为了现学现用有了目标所以学起来也挺快的今天刚刚从网上了买了个倒版的MATLABR2007a,这个是可以和C#进行混合编程的.原先我们都是用MATLABS好网络模型训练完 成后,得到权值阀值,再写算法在C#中重构,很麻烦!现在希望可以通过它们的混合编程 让预测做的简单.第一步:安装framwork与MCR:framwork在安装完后,也就安装好了 再安装MCR安装文 件保存在 matlab 的安装目录 toolbox 下 , C

31、:Program FilesMATLABR2007atoolboxcompilerdeploywi n32第二步完成编译器的设置:命令窗口输入 mbuild -setup 禾口 mex -setup,都选择 Microsoft Visual/c/c+ version in ptah loationMicrosoft Visual 2003选项。其中 ptah loation 为的路径名。下面是MATLAB C#昆合编程的一个简单的例子首先在MATLAB写下.m程序,如下:function test(h,D) for x=-10:10if xDy=h; hold on;plot(x,y)else

32、 if x MATLAB Builder NE - Generic COM Component /sizesize=12pt2)添加相应的M文件/sizesize=12pt3) 保存,编译 /sizesize=12pt4)新建 C#工程,添加 Reference, Ok/sizesize=12ptb4.使用 Matlab DeployTool 生成.Net 组件/b/sizesize=12pt1) 选择 New Deployment Project - MATLAB Builder NE - .Net Component/sizesize=12pt2) 添加相应的M文件/sizesize=12

33、pt3 保存,编译 /sizesize=12pt4新建C#工程,由于经常要/sizesize=12ptusingusingsize=12pt 因此需添加 MWArray这个Reference,一般安装玩 MATLAB Builder NE就有了,放在 GAC当中 的。 /sizeC#与 Matlab混合编程的几种方式主要参考资料:?Matlab C# Book,我看的是第一版的电子书,网上可以搜到。说实话,我觉得C#与 Matlab混合编程相比VC与Matlab混合编程 没有啥优势,根本上还是通过 P/V Invoke操作Matlab mcc编译器生成的C语言 版本的DLL。此外,速度上也慢的

34、吓人-_-下面简单写写C#W Matlab混合编程的4种方式可能还不够全,欢迎补充:1. 通过从Matlab的*m文件中生成C语言版本的DLL具体过程 :1在Matlab中写好一个m文件比方一个简单的加法函数;2使用 Matlab 的 mbuild -setup 选择编译器,我机器上的编译器有两个 LCC 和VC2021注意如果使用做应用的话,建议编译器选VC2021否那么C#中会告诉你 DLL 找不到 Entry Point3在命令行中使用 mcc -B csharedlib:mypluslib 如果是多个 M文件,接着往后写,等待几十秒之后会生成假设干文件*.c, *.h, *.dll等,

35、其中.h文件中有导出的函数原型。4建立C#工程,并将前面的 dll拷贝到适宜路径,使用Dlllmport,CallingConvention = 将.h文件中的函数使用C#的语法声明。一般来说,这 些函数中会有*Initialize,*Terminate 和 M文件中定义的函数*代表lib名称。5使用将C#中的数据类型和 Matlab中的矩阵等类型进行变换。该文件定义了 MatlabCSharp 类,主要是导入了中的一些函数,并封装了一些实用的函数如 double2mxArray_scalarReal 等。2. C# 调用 Matlab 工作区计算并返回结果主 要 使 用 engOpen, e

36、ngClose, engPutVariable,engEvalString,engGetVariable 函数进行操作。大致过程如下 :(ep, ml_a ,mx_a);(ep, ml_b ,mx_b);( ep, ml_c= ml_a + ml_b ;);mx_c = (ep,ml_c );3. 使用 Matlab DeployTool 生成 COMA件注:老版本的叫ComTool现在叫做 DeployTool。在Comma nd Win do里面直接 输入 deploytool 即可1) 选 择 New Deployment Project - MATLABBuilder NE - Gen

37、eric COMComponent2添加相应的M文件3保存,编译4新建C#工程,添加Referenee. Ok4. 使用 Matlab DeployTool 生成.Net 组件1选择 New Deployment Projeet - MATLAB Builder NE - .Net Component2添加相应的M文件3保存,编译4新建C#工程,由于经常要usingusing 因此需要添加 MWArray这个 Referenee,般安装完 matlab Builder NE 就有了,放在GAC当中的。e#和matlab的混合编程一这段时间一直在折腾 MATLAB要用神经网络做交通方面的预测.刚

38、开始对MATLAB个软件是 一窍不通,不过还好,这个软件的语言和 C语言差不多,很简单.因为我不是要精通它,只是为 了现学现用 . 有了目标所以学起来也挺快的. 今天刚刚从网上了买了个倒版的MATLABR2007a,这个是可以和C#进行混合编程的.原先我们都是用MATLAB做好网络模型训练完成后,得到权 值阀值,再写算法在 C#中重构,很麻烦!现在希望可以通过它们的混合编程,让预测做的简单.第一步:安装framwork与MCR:framwork在安装完后,也就安装好了 .再安装MCR安装文件 保 存 在 matlab 的 安 装 目 录 toolbox 下 , C:Program FilesMATLABR2007atoolboxeompilerdeploywin32第二步完成编译器的设置: 命令窗口输入 mbuild -setup 和 mex -setup ,都选择 Mierosoft Visual/e/e+ version inptah loationMicrosoft Visual 2003选项。其中 ptah loation 为的路径名。下面是MATLAB C#混合编程的一个简单的例子.首先在MATLAB写下.m程序,如下:function test(h,D)for x=-10:10if xDy=h;hold on;plot(x,y)else if x-Dy=-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论