



版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
关于matlab与c#混合编程的问题2012-06-0600:45shulai1008|浏览1573次在c#中输入相应的函数,如何把这个函数传递给matlab中的m文件,并且是按照函数来识别的分享到:2012-06-0611:08再不玩"疯狂攀岩"你就OUT啦!提问者采纳你是指,参数传递吧,怎么会有函数传递呢以下代码,供你参考,涉及到参数转换和传递,不懂的再补充吧usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingMathWorks.MATLAB.NET.Arrays;〃在MWArray.dll,最常用的usingMathWorks.MATLAB.NET.Utility;//在MWArray.dll,最常用的usingtest_erfc;//我在matlab中采样deploytool编译成test_erfc.dllnamespaceerfccc(classProgram|staticvoidMain(string[]args){test_erfc.test_erfcclassE=newtest_erfcclass();Console.WriteLine("输入x的值:”);intx=Convert.Tolnt32(Console.ReadLine());MWArray[]result=E.erfc(1,(MWArray)x);〃第一个参数取决于你的erfc有几个返回参数MWNumericArrayr1=(MWNumericArray)result[O];double[,]locationl=(double[J)r1.ToArray(MWArrayComponentReal);Console.WriteLine(location1[0,0].ToString());Console.ReadLine();}}}追问:
我的意思是如何将如sin(x)/x这样的表达式传递给matlab,完成从c#中输入表达式和积分上下限求积分的功能追答:这个我就不懂了,我也不知道能不能实现,如果是将表达式在matlab代码中固定,在C#中只传积分上下限的话可以实现追问:嗯,那也还是谢谢你了追答:如果你的函数有限,建议你还是写在matlab程序里,通过整型参数来识别用哪个函数Matlab和C#混合编程作者:axvfish(:/内联系TA)发布:2013-11-14在实验室算法演示和工程应用中存在这样的困惑:1.Matlab精通各种数值计算和算法,但是没有优美的界面,更不用说对数据库访问操作。2,Visualstudio(C#)拥有完美的界面编程,窗口或网络编程已经优越的数据库访问等优势。.国外有一本书叫:MATSBC#Book图书(已经放到压缩包中了),看过以后收获不少。.结合各种材料,我使用visualstudio2012+matlab2013a实现了从Winfrom调用Matlab命令行绘图Winfrom调用.m文件编译的dll并在WebBrowser中显示结果调用Matlab命令demo
2Mil .・61AIBJMAHUMVMilAcnMW—□v«Wneow«VK)ogiij ■••0 ■. •调用DlldemoG'G•#Q&»,0夜索帐决万RwreaskcE.:) q•0餐决方案-WinFormC*IIM8thb•仕个项目)>*k*WinFonnCallMatlabfrAProperties■c?l引用magicpro■MkrosoftCSharp"MLApp"MWArraySystem■System.CoreSy$tem.D«USystem.Data.DataSetExtensionsSystem.DeploymentSystenxDrawing"■System.WindowsJorm*■SystemJCml・SystemJCmLLinq■ServiceReferences口App.config・3C«IIMatlabFunctionByDLLcs>1JCallM«HabFunction8yDlL4>esignerxs力CallMatiibFunctionByDLLrMx►,C«HM«ti«bFunction8yDLL,3CallMatiabViaMatlabCommand.c5»11CflIIMatlabViaMatlabC0mm4nd.Des4gner.esliCaiMM.bVUM.tUbCcHnm«r>d.resx»,CallMatlabViaMatlabCo«nm«nd49mainFbrm.es»ImainForm.Designer.es15m«inForm.re$xD、mainForm►。Progr«m.ci层性轴关H贲湾号煤II团队资例造21解决方案结构当WinFormCaliMatlab.rar-WinRARJ文件(F)命令(。工S⑸收藏夹(O)选项(N)帮助(H)等这嗡出恸翻脸国添加解压到测试查看删除查找向导信息E垣WinFormCaliMatlab.rar-RAR压缩SZ件,集包K小为3,946,725-名称WinFormCallMatlabB,MATLABCSharp.pdf压缩包中包含MATU\BCSharp.pdf【原创】Matlab与.NET基于类型安全的接口混合编程入门回到目录1.前言MatlabBuilderNE工具箱是与C#混编的工具箱,里面的帮助文档很详细,提供了4种情况下与.NET混合编程的案例。.是简单的组件集成,通过Matlab生成DII程序集,在.NET环境中,通过MWArray组件来调用;.还有一个是在Web环境下使用Figure和混编的情况,与1比较类似;.另外一个就是我们今天要讲到的基于类型安全的接口编程以及对WCF和MEF的支持;.最后一个是在.NETRemoting技术中的使用。在初级入门教程中,以及我现在的混编开发中,都只是用到了第1个方法,和很简单,也很快,当然要你掌握了很多基础技术之后才能达到这个水平.今天要见到的基于接口的编程,有一个很大的好处就是可以避免类型转换,因为之前的方法都有大量的.NET和Matlab类型进行转换,基础不扎实的朋友很容易搞混淆。而基于接口的编程,则可以避免很多问题,但同时也对基础提出了更高的要求,要对接口定义,作用,以及方法多态等面向对象的特性更加了解。下面截图是在Matlab帮助的说明:WritingNETapplicationsthatcanaccessNETmethodsthatencapsulateMATLABcodeComDonentIntegrationSampleapplicationsthataccessmethodsdevelopedinMATLABComponentIntegrationLearnaboutcreatingtype-safeinterfaces,inordertoavoiddataconversiontaskswithMWArray.TyDe・SafeInterfaces,WCF,andMEFDeploying.NETcomponentsovertheWebWebDeploYmentofFiguresandImagesCreatingaremotablecomponentorlearningaboutremotablecomponents.NETRemotinq回到目录.Type-SafeInterfaces简单说明与直接编译为.NET程序集的要求不同,使用这项技术对.NET程序员的要求小很多,只需要很少的Matlab知识,但要对.NET技术精通,之前由于Matlab的数据类型和.NET的基本数据类型不兼容,所以为了使得Mallab和.NET程序进行数据通信,就需要使用下面的技术:l)Marshaldatafrom.NETinputdatatoadeployedfunctionbycreatinganMWArrayobjectfromnative.NETdata.ThepublicfunctionsinadeployedcomponentreturnMWArrayobjects.2)MarshaltheoutputMATLABdatainanMWArrayintonative.NETdatabycallingoneoftheMWArraymarshalingmethods(ToArrayO,forexample).所以使用传统的混编方式,又很多数据类型转换的过程。而在使用Type-SafeInterfaces技术后,这些中间过程都可以忽略,只需要关系输入的.NET类型以及输出的.NET类型结果,Matlab会对数据进行内部的转换处理。可以看看前后2副图的对比:
SimplifiedDataMarshalingWithaType-SafeInterface因此,我们可以很明显的看到Type-SafeInterfaces带来的优势:YouavoidtrainingandcodingcostsassociatedwithteachingenduserstoworkwithMWArrays.YouminimizecostofdatayoumustmarshalbyeitherplacingMWArrayobjectsintype-safeinterfacesorbycallingMWArray-basedfunctionsinthedeployedcomponent.Flexibility—youmixtype-safeinterfaceswithmanualdatamarshalingtoaccommodatedataofvaryingsizesandaccesspatterns.Forexample,youmayhaveafewlargedataobjects(images,forexample)thatwouldincurexcesscosttoyourorganizationifmanagedwithatype-safeinterface.Bymixingtype-safeinterfacesandmanualmarshaling,smallerdatatypescanbemanagedautomaticallywiththetype-safeinterfaceandyourlargedatacanbemanagedonanas-neededbasis.回到目录.Type-SafeInterfaces实际案例对这个混编方式,很显示可以节省很多事情,我认为,作为原始的数据类型转换方式,还是应该掌握的。在掌握了之后,再使用这个方法,会事半功倍,毕竟不是所有的问题都可以用接口解决。接下来,就让我们一起用一个小的编程实例,来演示整个过程的使用.演示环境:VisualStudio2010,Matlab2012a,.NET4.0演示内容:一个简单的乘法运算混编实现一、新建T类库类型的项目,名称MatlabDemo,.NET4.0,如下图所示:渤厮项目已安装的模板/VisualC#WindowsWebCloudReportingSilverlightWCFWorkflowSJSt其他语言其他项目类型备有库Windows窗体应用程序VisualC#囹WPF靖gVisualC#控制台应用程序VisualC#I53现VisualC#WPF浏览器应用程序VisualC#国Windows限务VisualC#1碣WPF用户控件库VisualC#1wWPF目定义控件库VisualC#▼排序依据:默认值.NETFramework4用于刽建C#类国VisualC#名称⑻:MatlabDemoS§(L):D:\Work\Matlab\MatlabDemo浏览(£).・・联机模板一、在上面的项目中添加一个接口文件IMultiply.cs,并编写下面的代码,因为我们实现的是一个简单的乘法,所以添加如下几个接口方法:1namespaceMatlabDemo234567891011121314III〈summary〉乘法接口〈/summary〉publicinterfaceIMultiply//2个数直接相乘doublemultiply(doublex,doubley);//数组相乘doublet]multiply(doublet]x,doubley);〃矩阵相乘doublet,]multiply(doublet,]x,doublet,]y);15}这里注意,一定要将接口的可访问性设置为Public,否则混编的时候,Matlab会找不到接口原型,编译失败。编写好,编译项目即可,会在bin文件夹下得到MatlabDemo.dll文件,这个文件下面的步骤会用到。三、编写M函数,并设置混编项目。我们编写一个简单的乘法M函数m,如下所示:functionz=multiply(x,y)z=x*y;注意这里的名称一定要和接口方法的名称对于起来,否则Matlab怎么会认识,想想就明白了。然后在Matlab中输入deploytool命令,输入项目名称:TypeSaftDemo,并选择项目类型:.NETAssembly,这个过程是"混编三部曲"基本过程,以前的视频中专门见到了,不仔细说明,如下图所示:4、DeploymentProjectNewOpenLocation:D:\Work\MatlabType: 匚WindowsStandaloneApplication£WindowsStandaloneApplication四ConsoleApplication口CSharedLibrary品C++SharedLibrary——售.NETAssemblyJavaPackage确定之后,混编项目基本就建立了,然后新建一个类DemoTest,并把上面编写的multiply.m函数添加到这个类中去,这其实就是一个常规的混编过程,很简单。添加完成
之后,如果是普通的混编方式,直接编译就可以了,但基于接口的混编方式,还有一个过程要设置,看下图,单击混编项目的设置(Settings...):句口,X1toplot▼Min.NETAssembly句口,X1toplot▼Min.NETAssembly品TypeSaftDemo.prjBuildClassesPackageT5NewProject...dOpenProject...DemoTest、DemoTest、RenameProject勺multiply.m[Addfiles][AddCg勺multiply.m[Addfiles][AddCgssl⑥AddClassAddMCR❷Help❷HelpBuild他PackageSharedResourcesandHelperFilesPlaceimages,datafiles,andGreferencedbyanyfunctions.Alsoplacehere:Functionscalledusingeval(anditsvariants)FunctionsnotontheMATLABpathPrivatefunctions如下图,打开设置后,选择"TypeSafeAPI"选项卡:首先,选择我们在第一个过程中编写好的MatlabDemo.dll接口文件,选择后,程序会自动搜索该dll中的可用接口(公开的),ffi.NETinterface下拉列表中显示,选择你需要的,这里我们是【Multiply,如下图所示的MatlabDemo.IMultiply,然后选择该接口和Matlab混编程序中对于的类,我们的multiply.m函数在DemoTest类中,如下图的Wrappedclass:
设置完成之后,关闭即可.然后编译,如果没有问题,提示编译成功之后,打开编译好的文件夹,我们可以看到如下3个dll文件:Package(98KB)I'oDemoTestIMultiply.dllreadme.txtyTypeSaftDemo.dll•ITypeSaftDemooverview.htmlTypeSaftDemoNative.dll[Addfiles/directories][AddMCR1生成的3个文件JypeSafeDemo.dll其实和普通的混编方式是一样的,可以和以前数据类型转换的方式一样使用;而DemoTestIMuItiply.d11和TypeSafeDemoNative.dll这2个
一起使用,Matlab已经在内部将数据转换过程封装好了,直接使用即可。第一种方式就不演示了,直接演示如何用接口来计算乘法。五、C#调用混编好的dll计算结果。在上一节中我们已经说明了几个dll的作用,下面将演示他们的用法,将DemoTestIMultiply.dll和TypeSafeDemoNative.dll一起复制到测试项目的C#项目中去(新建一个控制台测试项目),分别添加这几个dll的引用:MWAarray.dll和DemoTestIMultiply.dll以及TypeSafeDemoNative.dll。然后添加命名空间,具体核心代码如下所示:白usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;5usingMathWorks.MATLAB.NET.Arrays;usingMathWorks.MATLAB.NET.Utility;usingTypeSaftDemo;namespaceTypeSaftTest{classProgram{161718192021161718192021222324252627”);〃混编接口类的实例化DemoTestIMultiplydi=newDemoTestIMultiply();double[,]a=newdouble[2,2]{{1,2},{3,4}};doublet,]b=newdouble[2,2]{{6,7},{8,9}};〃分别演示接口的3种不同调用vartl=di.multiply(3,5);vart2=di.multiply(newdoublet]{1,2,3},5);vart3=di.multiply(a,b);Console.WriteLine(/z2个数直接相乘:*+tl.ToStringO);Console.Write("数组与单个数直接相乘:“);foreach(varitemint2)Console.Write(item.ToStringO+/z
Console.WriteLineO;Console.Write("矩阵乘法:”);foreach(varitemint3)Console.Write(item.ToStringO+"");Console.ReadKey();}))口结果如下图所示:*file:///D:/Work/Matlab/MatlabDemo/TypeSaftTest/bin/De2个数蹴相乘:15数组与革个敌直接相乘:5 10 15矩阵乘法:22 25 50 57上面就是Matlab和C#基于接口的混合编程的详细过程,混编是一个很有用的工具,但要用好,其实真的很难,接触混编这么长的时间以来,碰到过很多同学使用这个工具,绝大部分是误用,导致无故的工作量。要想混编成为自己工作和学习的得力助手,必须加强Matlab和.NET基础的学习,只有2者的基础掌握好了,足够熟悉这2个平台,你才可能更顺利的解决混编过程中遇到的问题.当混编出了问题的时候,需要很多经验才能度过难关,这一点很重要,不要指望学会这个过程,就可以解决所有问题。期待Mathworks公司对Matlab的混编编程支持越来越强大。
【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数.传统的Matlab.NET混合编程步骤传统的Matlab.NET混合编程有2种方式:l)Matlab编写好M函数,利用deploytool编译m函数生成dll,在C#项目中引用并调用;2)基于接口的编写方式,也是利用deploytool工具,过程繁琐一点,对编程人员素质要求高一点,但不需要进行繁琐的数据类型转换。我的博客有一篇文章专门介绍了这个混合编程方式,也有例子,大家有兴趣的可以看看:http:〃/asxinyu/archive/2013/05/16/3082299.html不管上面用哪种方式,Matlab和C#混编的基本步骤,大概都是下面的过程:1)编写M函数,并首先在Matlab中测试是正确可以调用的。注意命名规范,注释规范;2)使用命令打开deploytool工具,设置项目名称,选择类型:.NETAssembly,然后新建一个类,并添加编写好的M函数3)编译,生成dll,并在C#项目中添加引用(还需要引用对应版本的MWArray),利用对象浏览器查看生成dll的方法结构,并根据Matlab和C#的类型转换规则,进行数据转换即可,如果是接口的编程,这个过程相对要简单。回到目录.深入解析传统混编所生成的代码第一步:编写M函数,并测试可以使用为了好我们今天的目的相匹配,特意封装一个简单的内置函数,plot来画一个简单的图形,如下所示M函数functionPlotTest(n)%编写一个简单的函数,对plot进行简单封装一下plot(1:n,1:n);%测试正确,才可以进行下一步工作注意,混编必须是m函数function的形式才能被调用。上述函数简单测试一下,没有问题(复杂的函数一定要多测试,否则后续调试常困难).继续下一步..2第二步:在Matlab中使用deploytool建立混编项目在Matlab工作区输入命令:deploytooL然后得到下面界面,输入混编项目的名称,选择存储位置,关键的是类型那里一定要选择".NETAssembly",如下图所示:>■deploytool选择"0K"之后,下一步matlab界面右侧会出现项目解决方案,需要添加类名称和M文件。这个类名称,就是编译完成之后C#项目中的类对象名称,然后添加我们刚才上一步编写的"PlotTest.m",然后编译即可,如下图所示:
.NETAssemblyPlotTestprj ▼国财Build!Package"lasses(£)TestDemoPlotTestm[Addfiles][AddClassi到此为止,一个常规简单的Matlab.NET混编已经完成了60%了。编译完成之后,打开"Package"选项卡,即可看到生成的dll文件,然后点击右键,打开文件夹即可,如下图目标:.NETAssembly.NETAssembly国PlotTestprj▼"口◎
Build1Package|回回3回Package(1回回3回PlotTest_overview.htmlPlotTestNative.dllreadme.txt[Addfiles/directoriesl.3查看混编生成的代码这个过程很关键,其实包含很多信息,只不过95%以上的人都没有注意到其实混编生成的dll是有源文件的,通过查看源文件就应该知道混编的原理,只不过这是matlab自动生成而已。那看看生成的源码吧。打开Matlab混编项目的目录,可以看到有2个文件夹,“distrib",〃src〃2个文件夹。"distrib”文件夹就是上面图中生成的dll,注意有2个dll,l个是"项目名称.dll",一彳
是"项目名称Native.dll"这2个dll的差别可以通过“distrib”文件夹源码来观察。"distrib"就是源代码的文件夹。如下图所示,src文件夹的文件示意图:名称一mccEcdudedFiles6PlotTest.dll[=,PlotTest6PlotTest-overviewPlotTestNative.dll*PlotTestNativereadmeTestDemo.es⑥TestDemoNative.es我们2.2中新建的类名是TestDemo,所以生成的的源码名称也是TestDemo,看看这2个cs文件中的代码,同时类的方法也可以在VS中通过对象浏览器来查看dll有哪些方法以及方法的参数类型。直接贴这2个cs文件的代码,顺便解释和对比下:TestDemo.cs文件源码:/**MATLABCompiler:4.17(R2012a)*Date:MonSep0916:19:012013*Arguments:〃-B"〃macro_default"〃-W〃,zdotnet:PlotTest,TestDemo,0.0,private"〃-T〃*“D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest\src""-w〃*''enable:specified_file_mismatch/z〃-z,enable:repeated_file,z〃-w”*zzenable:switch_ignored,z,zenable:missing_lib_sentinel"-w”"enable:demo_license,z*-v“class{TestDemo:D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.m)*/usingSystem;usingSystem.Reflection;
usingSystem.10;usingMathWorks.MATLAB.NET.Arrays;usingMathWorks.MATLAB.NET.Utility;#ifSHARED[assembly:System.Reflection.AssemblyKeyFile(@z,//)]#endifnamespacePlotTest{III〈summary)IIITheTestDemoclassprovidesaCLScompliant,MWArrayinterfacetotheM-functions///containedinthefiles:III <newpara></newpara>III D:\Work\DevelopMentSVN\Matlab\MatlabBlog\PlotTest.mIII <newpara></newpara>III deployprint,mIII <newpara></newpara>III printdig.mIII </summary>III <remarks>III ©Version0.0/// </remarks>publicclassTestDemo:IDisposable(#regionConstructors39III <summaryinternal= 〃true〃>III Thestatic constructor instantiatesandinitializestheMATLABCompilerRuntimeIII instance.III </summary>staticTestDemo()(if(MWMCR.MCRAppInitialized){Assemblyassembly=Assembly.GetExecutingAssembly();stringctfFilePath=assembly.Location;51intlastDelimiter=ctfFilePath.LastlndexOf(@,z\z,);53
ctfFilePath=ctfFilePath.Remove(lastDelimiter,(ctfFilePath.Length-lastDelimiter));55stringctfFileName="PlotTest.ctf”;57StreamembeddedCtfStream=null;59String[]resourceStrings=assembly.GetManifestResourceNames();foreach(StringnameinresourceStrings)TOC\o"1-5"\h\z{if(name.Contains(ctfFileName))(embeddedCtfStream=assembly.GetManifestResourceStream(name);break;))mcr=newMWMCR(〃〃,ctfFilePath,embeddedCtfStream,true);)else{thrownewApplicationException(,zMWArrayassemblycouldnotbeinitialized^);)77 )7879III <summary>/// Constructs anewinstanceoftheTestDemoclass.III </summary>public TestDemo()84 (85 )868788ttendregionConstructors8990 SregionFinalize91III<summaryinternal=〃true〃>IIIClassdestructorcalledbytheCLRgarbagecollector.
949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136///</sununary>'TestDemo()(Dispose(false);}III<summary>IIIFreesthenativeresourcesassociatedwiththisobject///</summary>publicvoidDispose()(Dispose(true);GC.SuppressFinalize(this);///<summaryinternal="true"〉///Internaldisposefunction///〈/summary〉protectedvirtualvoidDispose(booldisposing)(if([disposed){disposed=true;if(disposing)(//Freemanagedresources;)//Freenativeresources))#endregionFinalize#regionMethods///<summary>///Providesavoidoutput,0-inputMWArrayinterfacetothePlotTestM-function.
137 III </summary>138 III <remarks>139 III M-Documentation:140 III编写一个简单的函数,对plot进行简单封装一下141 III </remarks>TOC\o"1-5"\h\z142 III143 publicvoidPlotTest()144 (145mcr.EvaluateFunction(0,"PlotTest”,newMWArray[]{});146 )147148149III<summary>150IIIProvidesavoidoutput,1-inputMWArrayinterfacetothePlotTestM-function.151 III </summary>152 III <remarks>153 III M-Documentation:154III编写一个简单的函数,对plot进行简单封装一下155 1/1 </remarks>156 III <paramname=z,n/z>Inputargument#l</param>TOC\o"1-5"\h\z157 III158publicvoidPlotTest(MWArrayn)159 (160mcr.EvaluateFunction(0,"PlotTest”,n);161 )162163164III<summary>165 ///Providesthestandard0-inputMWArrayinterfacetothePlotTestM-function.166 III </summary>167 III <remarks>168 III M-Documentation:169III编写一个简单的函数,对plot进行简单封装一下170 III </remarks>171III<paramname=z,numArgsOut>Thenumberofoutputargumentstoreturn.</param>172III<returns>AnArrayoflength"numArgsOut〃containingtheoutput173 ///arguments.</returns>174 ///175 public MWArray[]PlotTest(intnumArgsOut)176 (
177returnmcr.EvaluateFunction(numArgsOut,“PlotTest”,newMWArray[]{});178 }179180181III<summary>182IIIProvidesthestandard1-inputMWArrayinterfacetothePlotTestM-function.183 /// </summary>184 /// <remarks>185 III M-Documentation:186III编写一个简单的函数,对plot进行简单封装一下187 III </remarks>188III<paramname=,,numArgsOut">Thenumberofoutputargumentstoreturn.</param>189III<paramname=〃n〃>Inputargument#l</param>190III<returns>AnArrayoflength"numArgsOut"containingtheoutput191IIIarguments.</returns>TOC\o"1-5"\h\z192 III193 publicMWArray[]PlotTest(intnumArgsOut,MWArrayn)194 (195returnmcr.EvaluateFunction(numArgsOut,“PlotTest”,n);196 )197198199200III<summary>201IIIThismethodwillcauseaMATLABfigurewindowtobehaveasamodaldialogbox.202IIIThemethodwillnotreturnuntilallthefigurewindowsassociatedwiththis203 III componenthave been closed.204 III </summary>205 III <remarks>206 III Anapplication should only callthismethodwhenrequiredtokeepthe207IIIMATLABfigurewindowfromdisappearing.Othertechniques,suchascalling208 IIIConsole.ReadLine()fromtheapplicationshouldbeconsideredwhere209 ///possible.</remarks>210 III211 publicvoidWaitForFiguresToDie()
212 (213mcr.WaitForFiguresToDie();214 )215216217218 SendregionMethods219220 #regionClassMembers221privatestaticMWMCRmcr=null;223224 privatebooldisposed二false;225226 #endregionClassMembers227 )228)TestDemoNative.es文件源码:□口/**MATLABCompiler:4.17(R2012a)*Date:MonSep0916:19:012013*Arguments:〃-B〃,zmacro_default/zz,dotnet:PlotTest,TestDemo,0.0,private'"-T"*"link:lib""-d"“D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest\src"","*'"enable:specified_file_mismatch^”-^enable:repeated_file,z"*“enable:switch_ignored〃"-,/enable:missing_lib_sentinel,z“enable:demo_license/z*“class{TestDemo:D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.m},,*/usingSystem;usingSystem.Reflection;usingSystem.10;usingMathWorks.MATLAB.NET.Arrays;usingMathWorks.MATLAB.NET.Utility;#ifSHARED
[assembly:System.Reflection.AssemblyKeyFile(@,/,z)]#endifnamespacePlotTestNative(III<sumniary>IIITheTestDemoclassprovidesaCLScompliant,Object(native)interfacetotheIII M-functionscontainedinthefiles:III <newpara></newpara>III D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.mIII <newpara></newpara>/// deployprint,m/// <newpara></newpara>III printdig.mIII </summary>III <remarks>III ©Version0.0III </remarks>publicclassTestDemo:IDisposable(#regionConstructors39III <summaryinternal= 〃true〃>/// Thestatic constructor instantiatesandinitializestheMATLABCompilerRuntimeIII instance.III </summary>staticTestDemo()(if(MWMCR.MCRAppInitialized){Assemblyassembly=Assembly.GetExecutingAssembly();49stringctfFilePath=assembly.Location;51intlastDelimiter=ctfFilePath.LastlndexOf(@"\〃);53ctfFilePath=ctfFilePath.Remove(lastDelimiter,(ctfFilePath.Length-lastDelimiter));55stringctfFileName="PlotTest.ctf”;57
StreamembeddedCtfStream=nullStreamembeddedCtfStream=null;5960 String[]resourceStrings=assembly.GetManifestResourceNames();61foreach(StringnameinresourceStrings)TOC\o"1-5"\h\z(if(name.Contains(ctfFileName))(embeddedCtfStream=assembly.GetManifestResourceStream(name);break;))mcr=newMWMCR(",ctfFilePath,embeddedCtfStream,true);)else(thrownewApplicationException(,/MWArrayassemblycouldnotbeinitialized'7);)77 )7879/// <summary>III Constructs anewinstanceoftheTestDemoclass.III </summary>public TestDemo()(85 }868788 #endregionConstructors8990 #regionFinalize91///<summaryinternal=〃true〃>IIIClassdestructorcalled bytheCLRgarbagecollector.III</summary>"TestDemo()(Dispose(false);)
99100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136///<summary>///FreesthenativeresourcesassociatedwiththisobjectIII</summary>publicvoidDispose()(Dispose(true);GC.SuppressFinalize(this);)///<summaryinternal="true"〉IIIInternaldisposefunctionIII</summary>protectedvirtualvoidDispose(booldisposing){if(!disposed){disposed=true;if(disposing){//Freemanagedresources;}//Freenativeresources)#endregionFinalize#regionMethodsIII<summary>IIIProvidesavoidoutput,0-inputObjectinterfacetothePlotTestM-function.137138139140137138139140141///〈remarks〉III^-Documentation:///编写一个简单的函数,对plot进行简单封装一下III</remarks>
TOC\o"1-5"\h\z142 III143 publicvoidPlotTest()144 (145mcr.EvaluateFunction(0,"PlotTest”,newObject[]{});146 )147148149III<summary>150 ///Providesavoidoutput,「inputObjectinterfacetothePlotTestM-function.151 III </summary>152 III <remarks>153 III M-Documentation:154III编写一个简单的函数,对plot进行简单封装一下155 III </remarks>156III<paramname="n〃>Inputargument#l</param>TOC\o"1-5"\h\z157 III158publicvoidPlotTest(Objectn)159 (160mcr.EvaluateFunction(0,"PlotTest',n);161 )162163164III<summary>165IIIProvidesthestandard0-inputObjectinterfacetothePlotTestM-function.166 III </summary>167 III <remarks>168 III M-Documentation:169 ///编写一个简单的函数,对plot进行简单封装一下170 III </remarks>171III<paramname=z,numArgs0utz/>Thenumberofoutputargumentstoreturn.</param>172 III <returns>AnArrayof length"numArgsOut'containingtheoutput173 III arguments.</returns>TOC\o"1-5"\h\z174 III175 publicObject[]PlotTest(intnumArgsOut)176 (177returnmcr.EvaluateFunction(numArgsOut,'PlotTestnewObject[]{});178 )179180
181III<summary>182IIIProvidesthestandard1-inputObjectinterfacetothePlotTestM-function.183 III </summary>184 III <remarks>185 III M-Documentation:186III编写一个简单的函数,对plot进行简单封装一下187 III </remarks>188 ///<paramname=/,numArgsOutz,>Thenumberofoutputargumentstoreturn.</param>189III<paramname=〃n〃>Inputargument#K/param>190III<returns>AnArrayoflength"numArgsOut"containingtheoutput191IIIarguments.</returns>TOC\o"1-5"\h\z192 III193 publicObject[]PlotTest(intnumArgsOut,Objectn)194 (195returnmcr.EvaluateFunction(numArgsOut,“PlotTest”,n);196 )197198199 ///<summary>200IIIProvidesaninterfaceforthePlotTestfunctioninwhichtheinputandoutput201 III argumentsare specified as an array of Objects.202 /// </summary>203 III <remarks>204 III Thismethodwill allocateand returnby referencetheoutputargument205 IIIarray.<newpara></newpara>206 IIIM-Documentation:207 III编写一个简单的函数,对plot进行简单封装一下208 III</remarks>209III<paramname=,,numArgsOutz/>Thenumberofoutputargumentstoreturn</param>210III<paramname="argsOut”>ArrayofObjectoutputarguments〈/param>211III<paramname=z,argsIn,z>ArrayofObjectinputarguments</param>212 III <paramname="varArgsIn〃>Array of Objectrepresentingvariableinput213 /// arguments</param>214 III215 [MATLABSignatureCPlotTest", 1, 0, 0)]
216 protectedvoidPlotTest(intnumArgsOut,refObject[]argsOut,Object[]argsln,paramsObject[]varArgsIn)217 (218 mcr.EvaluateFunctionForTypeSafeCall("PlotTest”,numArgsOut,refargsOut,argsln,varArgsIn);219 )220221 III<summary>222IIIThismethodwillcauseaMATLABfigurewindowtobehaveasamodaldialogbox.223IIIThemethodwillnotreturnuntilallthefigurewindowsassociatedwiththis224 III componenthave been closed.225 III </summary>226 III <remarks>227 III Anapplication shouldonly callthismethodwhenrequiredtokeepthe228IIIMATLABfigurewindowfromdisappearing.Othertechniques,suchascalling229IIIConsole.ReadLine()fromtheapplicationshouldbeconsideredwhere230IIIpossible.</remarks>TOC\o"1-5"\h\z231 III232 publicvoidWaitForFiguresToDie()233 (234mcr.WaitForFiguresToDie();235 )236237238239ttendregionMethods240241 ttregionClassMembers242243 privatestaticMWMCRmcr=null;244245 privatebooldisposed=false;246247 ttendregionClassMembers248 )249}
对比大家就可以发现,只不过一个更加傻瓜化,参数都是Object了,其实这样反而不好,增加了类型转换的代价,如果知道,为何不给一个正确的给他呢.关于这2个dll的速度,曾经听说过是有差别的,博客园有人给过测试,我没实际测试过,还是习惯用传统的TestDemo.cs,因为参数类型都是Object,不直观,出了问题也有点头疼。2.4上述Matlab自动生成代码的要点后面某些类或者方法的XML注释就不说了,自动生成的东西,可以对照M文件的注释来看。1.首先看第一段的注释信息:/**MATLABCompiler:4.17(R2012a)*Date:MonSep0916:19:012013*Arguments:"-B〃z,macro_defau11”一旷/,dotnet:PlotTest,TestDemo,0.0,private""-T〃*"link:lib"〃—d"/zD:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest\src,z*enable:specified_fi1e_mismatch,z〃-w〃,zenable:repeated_filez,"-w〃*''enable:switch_ignoredz,"-w〃zzenable:missing_lib_sentinelz,〃-w〃“enable:demo_license,z*-v“class{TestDemo:D:\Work\DevelopMent_SVN\Matlab\MatlabBlog\PlotTest.m}*/usingSystem;usingSystem.Reflection;usingSystem.10;usingMathWorks.MATLAB.NET.Arrays;usingMathWorks.MATLAB.NET.Utility;上面这段信息主要是说明当前Matlab编译器的版本,因为编译的版本和部署的MCR版本必须对应起来,否则是不能运行的。然后有编译日期,以及编译的参数,类名以及M函数
的地址等信息,其实知道这些参数,理论上是可以自己在程序里面调用Matlab的编译器进行编译工作的,只不过比较复杂,能力有限,研究不下去。下面的引用大家应该明白,这个是MWArray.dll里面的命名空间,所以混编的项目都要引用对应版本的MWArray.dll2.关耀的静态构造函数staticTestDemo()(if(MWMCR.MCRAppInitialized){Assemblyassembly=Assembly.GetExecutingAssembly();stringctfFilePath=assembly.Location;intlastDelimiter=ctfFilePath.LastlndexOf(@z,\,z);ctfFilePath=ctfFilePath.Remove(lastDelimiter,(ctfFilePath.Length-lastDelimiter));stringctfFileName="PlotTest.ctf”;StreamembeddedCtfStream=null;String[]resourceStrings=assembly.GetManifestResourceNames();foreach(StringnameinresourceStrings)TOC\o"1-5"\h\z{if(name.Contains(ctfFileName)){embeddedCtfStream=assembly.GetManifestResourceStream(name);break;))mcr=newMWMCRC,z/,ctfFilePath,embeddedCtfStream,true);}else{thrownewApplicationException(z,MWArrayassemblycouldnotbeinitialized77);)}
如果有一些C#的开发和编程经验看上面的代码问题应该不大,否则还真有点难说清楚,简单的说几个要点:1)这个构造函数的作用主要是检测MCR对象是否初始化,如果没有,则寻找程序集,并拼接资源的位置,正确进行初始化2)上面的ctf其实是包含在dll程序集里面的,以资源的形式,这个文件是核心,它才真正的包括了Matlab编译之后的,MCR可以运行的中间程序。3)必须要合法正确的ctf文件和dll文件才能正确的初始化mcr对象,合法的意思,是Matlab内部有校验机制,包括对相关版本,在以前的版本生成文件中,很明显,现在2012a里面都隐藏起来了,不过要求都一样。4)上面方法其实已经间接的告诉了我们怎么初始化mcr对象,有了mcr对象,一切都好办了,因为它才是MCR的核心。3.PlotTest封装的方法代码public void PlotTest()TOC\o"1-5"\h\z{mcr.EvaluateFunction(0,"PlotTest”,newMWArray[]{});)public void PlotTest(MWArray n){mcr.EvaluateFunction(0,"PlotTest”,n);)public MWArray[]PlotTest(int numArgsOut)\o"CurrentDocument"{returnmcr.EvaluateFunction(numArgsOut,“PlotTest”,newMWArray[]{});)publicMWArray[]PlotTest(intnumArgsOut,MWArrayn)\o"CurrentDocument"{returnmcr.EvaluateFunction(numArgsOut,“PlotTest”,n);
看了字段代码,再对应mcr的初始化其实都很明朗了。通过mcr的EvaluateFunction来调用M函数。上面的代码有几个重载方法,可以实用很多不同的情况,有时候,这些方法的个数会更多,其实没多大必要,也可以自己编译一下,把没用的删掉,保留少数几个有用的即可。同时也可以看到,这里直接通过字符串来传递函数名称的,因此必须保证这个函数能被mcr搜索到.比如我们这里的“PlotTest”这个函数其实就包含了ctf文件中(注意ctf文件是可以和dll分开的,在混编项目里可以设置)。回到目录3.上述代码到内置函数的调用上述已经讲解了整个mcr调用的过程,其实就是通过mcr的EvaluateFunction来调用M函数,但要保证对于的函数名称在mcr搜索的范围内。那么我们是不是可以假设:内置函数都在MCR内部,应该是可以搜索到的,那么把上面的函数名称换一下,是不是也是可行的.这个假设也是我最早接触时候的想法,有了假设,当然要去验证。现在看来这个当然是肯定的,那么不妨重新演示一遍.过程不详细讲了,代码也有注释,混编要引用的MWArray.dll和命名空间也不提了,看代码:©usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Reflection;usingSystem.10;usingMathWorks.MATLAB.NET.Utility;usingMathWorks.MATLAB.NET.Arrays;
12namespaceBui1dInFunctionDemo13{141516171819classProgram]staticMWMCRmcr;staticvoidMain(string[]args){ttregion首先使用PlotTest.dll来初始化mcr,因为这个dll是混编“合法”产生的,只有这样才能顺利启动mcr202122if(MWMCR.MCRAppInitialized){stringpath=Path.Combine(System.Environment.CurrentDirectory,'PlotTest.dlT);23242526Assemblyassembly=Assembly.LoadFile(path);stringctfFilePath=assembly.Location;intlastDelimiter=ctfFilePath.LastlndexOf(@,z\z,);ctfFilePath=ctfFilePath.Remove(lastDelimiter,(ctfFilePath.Length-lastDelimiter));272829stringctfFileName="PlotTest.ctf”;StreamembeddedCtfStream=null;String[]resourceStrings=assembly.GetManifestResourceNames();303132333435foreach(StringnameinresourceStrings){if(name.Contains(ctfFileName))(embeddedCtfStream=assembly.GetManifestResourceStream(name);36373839true);40414243break;))mcr=newMWMCRctfFilePath,embeddedCtfStream,else{thrownewApplicati
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年考研政治中国近现代史纲要图表题历史事件发展目标试题卷
- 2025年西班牙语DELEC1模拟试卷:旅游体验分享与高级语言组织
- 患者昏迷的应急预案与流程
- 滨江区高三年级英语下学期模拟考试概要写作技巧评估试卷
- 2025年剑桥英语CAE(C1)模拟试卷深度剖析:商务英语与高级写作技巧揭秘
- IGCSE中文第一语言2024-2025模拟试卷:文言文阅读与写作技巧提升
- 2025年国际汉语教师证书笔试:教学理论与实践课程评估与反馈技巧
- 喷灌类可行性研究报告
- 2025年数字创意建模师认证模拟试卷:3D数字模型创建与优化专业试题集
- 2025年牙买加国际课程四年级上学期期末地理试题
- 物流运输企业安全隐患排查记录表
- 神经病学题库及神经病学试题题库
- 糖尿病酮症完整版本
- 五年级下册数学约分练习100题附答案
- 跨文化交流中的语言适应性研究
- 第5.2课 《飞向太空的航程》同步练习 (原卷版)
- 新概念英语第二册Lesson8课件
- 地摊市集活动策划方案
- 劳务外包与劳务派遣课件
- 白酒行业财务知识培训课件
- 智慧仓储配送机器人案例
评论
0/150
提交评论