《关于matlab与c混合编程的问题.docx》由会员分享,可在线阅读,更多相关《关于matlab与c混合编程的问题.docx(67页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、关于matlab与c#混合编程的问题2012-06-06 00:45shulai 1008 | 浏览 1573 次在c#中输入相应的函数,如何把这个函数传递给matlab中的m文件,并且是按照函数来 识别的分享到:2012-06-06 11:08再不玩疯狂攀岩你就OUT啦!提问者采纳你是指,参数传递吧,怎么会有函数传递呢以下代码,供你参考,涉及到参数转换和传递,不懂的再补充吧using System;using System.Collections.Generic;using System.Linq;using System.Text;using MathWorks.MATLAB.NET.Ar
2、rays;在 MWArray.dll,最常用的using MathWorks.MATLAB.NET.Utility;/ 在 MWArray.dll,最常用的using test_erfc;/ 我在 matlab 中采样 deploytool 编译成 test_erfc.dll namespace erfccc(class Program |static void Main(string args) test_erfc.test_erfcclass E = new test_erfcclass();Console.WriteLine(输入 x 的值:”);int x = Convert.Toln
3、t32(Console.ReadLine();MWArray result = E.erfc(1, (MWArray)x); 第一个参数取决于你的 erfc 有 几个返回参数MWNumericArray r1 = (MWNumericArray)resultO;double, locationl = (doubleJ)r1 .ToArray(MWArrayComponentReal);Console.WriteLine(location1 0, 0.ToString();Console.ReadLine(); 追问:我的意思是如何将如sin(x)/x这样的表达式传递给ma tlab,完成从c#
4、中输入表达式和积分上下限求积分的 功能追答:这个我就不懂了,我也不知道能不能实现,如果是将表达式在matlab代码中固定,在C#中只传积分上下限的话可以实现追问:嗯,那也还是谢谢你了追答:如果你的函数有限,建议你还是写在matlab程序里, 通过整型参数来识别用哪个函数Matlab和C#混合编程作者:axvfish (:/内联系TA) 发布:2013-11-14在实验室算法演示和工程应用中存在这样的困惑:1. Matlab精通各种数值计算和算法,但是没有优美的界面,更不用说对数据库访问操作。2,Visual studio(C#)拥有完美的界面编程,窗口或网络编程已经优越的数据库访问等优势。3
5、.国外有一本书叫:MATSB C# Book图书(已经放到压缩包中了),看过以后收获不少。4 .结合各种材料,我使用visual studio 2012+ matlab 2013a实现了从Winfrom调用Matlab命令行绘图Winfrom调用.m文件编译的dll并在WebBrowser中显示结果调用Matlab命令demo2 Mil.6 1AIBJ MA HUM VMi lAcn MW vWn eow VK)o giij 0.调用 Dll demoG G # Q & ,0夜索帐决万RwreaskcE. :)q 0餐决方案-WinFormC*IIM8thb仕个项目)* k* WinFonnC
6、allMatlabfr A Properties c?l引用magicpro MkrosoftCSharp MLApp MWArray System System.CoreSy$tem.DUSystem.Data.DataSetExtensionsSystem.DeploymentSystenxDrawing System. Windows Jorm* SystemJCml SystemJCmLLinq Service References口 App.config 3 CIIMatlabFunctionByDLLcs 1J CallMHabFunction8yDlL4esignerxs 力 C
7、allMatiibFunctionByDLLrMx,CHMtibFunction8yDLL,3 CallMatiabViaMatlabCommand.c5 11 CflIIMatlabViaMatlabC0mm4nd.Des4gner.es li CaiMM.bVUM.tUbCcHnmrd.resx,CallMatlabViaMatlabConmnd49 mainFbrm.es I mainForm.Designer.es15 minForm.re$xD 、mainForm 。Progrm.ci层性 轴关H贲湾号煤II团队资例造21解决方案结构当 WinFormCaliMatlab.rar -
8、 WinRARJ文件(F)命令(。工S收藏夹(O)选项(N)帮助(H)等这嗡出恸翻脸国添加 解压到 测试 查看 删除 查找 向导 信息E 垣 WinFormCaliMatlab.rar - RAR 压缩SZ件,集包K小为 3,946,725 -名称WinFormCallMatlabB, MATLABCSharp.pdf压缩包中包含MATUBCSharp.pdf【原创】Matlab与.NET基于类型安全的接口混合编程入门回到目录1.前言Matlab Builder NE工具箱是与C#混编的工具箱,里面的帮助文档很详细,提供了 4种情况下与.NET混合编程的案例。1 .是简单的组件集成,通过Mat
9、lab生成DII程序集,在.NET环境中,通过MWArray组件 来调用;2 .还有一个是在Web环境下使用Figure和混编的情况,与1比较类似;3 .另外一个就是我们今天要讲到的基于类型安全的接口编程以及对WCF和MEF的支持;4 .最后一个是在.NET Remoting技术中的使用。在初级入门教程中,以及我现在的混编开发中,都只是用到了第1个方法,和很简单,也 很快,当然要你掌握了很多基础技术之后才能达到这个水平.今天要见到的基于接口的编程, 有一个很大的好处就是可以避免类型转换,因为之前的方法都有大量的.NET和Matlab类 型进行转换,基础不扎实的朋友很容易搞混淆。而基于接口的编程
10、,则可以避免很多问题, 但同时也对基础提出了更高的要求,要对接口定义,作用,以及方法多态等面向对象的特性 更加了解。下面截图是在Matlab帮助的说明:Writing NET applications that can access NET methods that encapsulate MATLAB codeComDonent IntegrationSample applications that access methods developed in MATLABComponent IntegrationLearn about creating type-safe interfaces,
11、 in order to avoid data conversion tasks with MWArray.TyDeSafe Interfaces, WCF, and MEFDeploying .NET components over the WebWeb DeploYment of Figures and ImagesCreating a remotable component or learning about remotable components. NET Remotinq回到目录2 .Type-Safe Interfaces 简单说明与直接编译为.NET程序集的要求不同,使用这项技
12、术对.NET程序员的要求小很多,只需要很少的Matlab知识,但要对.NET技术精通,之前由于Matlab的数据类型和.NET的基本数据类型不兼容,所以为了使得Mallab和.NET 程序进行数据通信,就需要使用下面的技术:l)Marshal data from .NET input data to a deployed function by creating an MWArr ay object from native .NET data.The public functions in a deployed component return MWArray objects.2)Marsha
13、l the output MATLAB data in an MWArray into native .NET data by callin g one of the MWArray marshaling methods (ToArrayO, for example).所以使用传统的混编方式,又很多数据类型转换的过程。而在使用Type-Safe Interfaces技术 后,这些中间过程都可以忽略,只需要关系输入的.NET类型以及输出的.NET类型结果,Matlab会对数据进行内部的转换处 理。可以看看前后2副图的对比:Simplified Data Marshaling With a Typ
14、e-Safe Interface因此,我们可以很明显的看到Type-Safe Interfaces带来的优势:You avoid training and coding costs associated with teaching end users to work wi th MWArrays.You minimize cost of data you must marshal by either placing MWArray objects in type-safe interfaces or by calling MWArray-based functions in the deplo
15、yed com ponent.Flexibility you mix type-safe interfaces with manual data marshaling to accomm odate data of varying sizes and access patterns.For example, you may have a few large data objects (images, for example) that wo uld incur excess cost to your organization if managedwith a type-safe interfa
16、ce. By mixing type-safe interfaces and manual marshaling, smaller data types can be managedautomatically with the type-safe interface and your large data can be managed on an as-needed basis.回到目录3 .Type-Safe Interfaces 实际案例对这个混编方式,很显示可以节省很多事情,我认为,作为原始的数据类型转换方式,还是 应该掌握的。在掌握了之后,再使用这个方法,会事半功倍,毕竟不是所有的问题
17、都可以用 接口解决。接下来,就让我们一起用一个小的编程实例,来演示整个过程的使用.演示环境:Visual Studio 2010 , Matlab 2012a,.NET 4.0演示内容:一个简单的乘法运算混编实现 一、新建T 类库类型的项目,名称MatlabDemo , .NET 4.0 ,如下图所示:渤厮项目已安装的模板/ Visual C# Windows Web Cloud Reporting Silverlight WCF Workflow SJSt其他语言 其他项目类型 备有库Windows窗体应用程序Visual C#囹WPF 靖gVisual C#控制台应用程序Visual C#
18、I 53现Visual C#WPF浏览器应用程序Visual C#国Windows 限务Visual C#1碣WPF用户控件库Visual C#1 wWPF目定义控件库Visual C#排序依据:默认值.NET Framework 4用于刽建C#类国Visual C#名称:MatlabDemoS(L):D:WorkMatlabMatlabDemo浏览().联机模板一、在上面的项目中添加一个接口文件IMultiply.cs ,并编写下面的代码,因为我们实现的是一个简单的乘法,所以添加如下几个接口方法:1 namespace MatlabDemo234567891011121314IIIsumma
19、ry乘法接口/summary public interface IMultiply/2个数直接相乘double multiply(double x, double y);/数组相乘doublet multiply(doublet x, double y);矩阵相乘doublet, multiply (doublet, x, doublet, y);15 这里注意,一定要将接口的可访问性设置为Public ,否则混编的时候,Matlab会找不到 接口原型,编译失败。编写好,编译项目即可,会在bin文件夹下得到MatlabDemo.dll 文件,这个文件下面的步骤会用到。三、编写M函数,并设置混编
20、项目。我们编写一个简单的乘法M函数m ,如下所示:1 function z = multiply(x, y)23 z = x * y;注意这里的名称一定要和接口方法的名称对于起来,否则Matlab怎么会认识,想想就明白了。然后在Matlab中输入deploytool命令,输入项目名称:TypeSaftDemo ,并选择项目类型:.NET Assembly,这个过程是混编三部曲基本过程,以前的视频中专门见到了,不仔细说明,如下图所示:4、Deployment ProjectNew OpenLocation: D:WorkMatlabType:匚 Windows Standalone Applic
21、ation Windows Standalone Application 四 Console Application口 C Shared Library 品C+ + Shared Library售.NET AssemblyJava Package确定之后,混编项目基本就建立了,然后新建一个类DemoTest,并把上面编写的multiply.m函数添加到这个类中去,这其实就是一个常规的混编过程,很简单。添加完成之后,如果是普通的混编方式,直接编译就可以了,但基于接口的混编方式,还有一个过程要设置,看下图,单击混编项目的设置(Settings.):句口, X 1 to plot Min.NET A
22、ssembly品 TypeSaftDemo.prjBuildClassesPackageT5 New Project.d Open Project.DemoTest、Rename Project勺 multiply.m Add filesAdd Cgssl Add ClassAdd MCR HelpBuild 他 PackageShared Resources and Helper FilesPlace images, data files, and G referenced by any functions.Also place here: Functions called using ev
23、al (and its variants) Functions not on the MATLAB path Private functions如下图,打开设置后,选择Type Safe API选项卡:首先,选择我们在第一个过程中编写好的MatlabDemo.dll接口文件,选择后,程序会自动搜索该dll中的可用接口(公开的),ffi.NET interface下拉列表中显示,选择你需要的,这里我们是【Multiply,如下图所示的MatlabDemo.IMultiply,然后选择该接口和Matlab混编程序中对于的类,我们的multiply.m函数在DemoTest类中,如下图的Wrappe
24、d class:设置完成之后,关闭即可.然后编译,如果没有问题,提示编译成功之后,打开编译好的文件夹,我们可以看到如下3个dll文件:Package (98 KB)I o DemoTestIMultiply.dll readme.txty TypeSaftDemo.dllI TypeSaftDemo overview.html TypeSaftDemoNative.dllAdd files/directories Add MCR1生成的3个文件JypeSafeDemo.dll其实和普通的混编方式是一样的,可以和以前数据类型转换的方式一样使用;而 DemoTestIMuItiply.d11 和
25、TypeSafeDemoNative.dll 这 2 个一起使用,Matlab已经在内部将数据转换过程封装好了,直接使用即可。第一种方式就不 演示了,直接演示如何用接口来计算乘法。五、C#调用混编好的dll计算结果。在上一节中我们已经说明了几个dll的作用,下面将演 示他们的用法,将 DemoTestIMultiply.dll 和 TypeSafeDemoNative.dll 一起复制到测试 项目的C#项目中去(新建一个控制台测试项目),分别添加这几个dll的引用:MWAarray.dll 和DemoTestIMultiply.dll以及TypeSafeDemoNative.dll。然后添加命
26、名空间,具体核心 代码如下所示:白1 using System;2 using System. Collections. Generic;3 using System. Linq;4 using System. Text; 56 using MathWorks. MATLAB. NET. Arrays;7 using MathWorks. MATLAB. NET. Utility;89 using TypeSaftDemo;1011 namespace TypeSaftTest12 13 class Program14 161718192021222324252627”);15 static
27、void Main(string args)混编接口类的实例化DemoTestIMultiply di = new DemoTestIMultiply();double , a = new double 2, 2 1,2, 3, 4 ;doublet, b = new double2, 2 6, 7 , 8, 9 ;分别演示接口的3种不同调用var tl = di. multiply(3, 5);var t2 = di. multiply(new doublet 1, 2, 3 , 5);var t3 = di. multiply(a, b);Console. WriteLine(/z2 个数
28、直接相乘:*+tl. ToStringO);Console. Write (数组与单个数直接相乘:“);foreach (var item in t2 ) Console. Write (item. ToStringO+/z28 Console. WriteLineO ;29 Console. Write (矩阵乘法:”);30 foreach (var item in t3) Console. Write (item. ToStringO +);31 Console. ReadKey ();32 33 )34 )口结果如下图所示:* file:/D:/Work/Matlab/MatlabDe
29、mo/TypeSaftTest/bin/De2个数蹴相乘:15数组与革个敌直接相乘:51015矩阵乘法:22255057上面就是Matlab和C#基于接口的混合编程的详细过程,混编是一个很有用的工具, 但要用好,其实真的很难,接触混编这么长的时间以来,碰到过很多同学使用这个工具,绝 大部分是误用,导致无故的工作量。要想混编成为自己工作和学习的得力助手,必须加强 Matlab和.NET基础的学习,只有2者的基础掌握好了,足够熟悉这2个平台,你才可能 更顺利的解决混编过程中遇到的问题.当混编出了问题的时候,需要很多经验才能度过难关, 这一点很重要,不要指望学会这个过程,就可以解决所有问题。期待Ma
30、thworks公司对Matlab的混编编程支持越来越强大。【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数1 .传统的Matlab.NET混合编程步骤传统的Matlab.NET混合编程有2种方式:l)Matlab编写好M函数,利用deploytool编译m函数生成dll ,在C#项目中引用并调 用;2)基于接口的编写方式,也是利用deploytool工具,过程繁琐一点,对编程人员素质要求 高一点,但不需要进行繁琐的数据类型转换。我的博客有一篇文章专门介绍了这个混合编程方式,也有例子,大家有兴趣的可以看看:http: 不管上面用哪种方式,Matlab和C#混编的基本步骤,大
31、概都是下面的过程:1)编写M函数,并首先在Matlab中测试是正确可以调用的。注意命名规范,注释规范;2)使用命令打开deploytool工具,设置项目名称,选择类型:.NET Assembly,然后新 建一个类,并添加编写好的M函数3)编译,生成dll,并在C#项目中添加引用(还需要引用对应版本的MWArray),利用对 象浏览器查看生成dll的方法结构,并根据Matlab和C#的类型转换规则,进行数据转换 即可,如果是接口的编程,这个过程相对要简单。回到目录2 .深入解析传统混编所生成的代码2.1 第一步:编写M函数,并测试可以使用为了好我们今天的目的相匹配,特意封装一个简单的内置函数,p
32、lot来画一个简单的图形, 如下所示M函数1 function PlotTest(n)2 %编写一个简单的函数,对plot进行简单封装一下3 plot(1:n, 1:n);4 %测试正确,才可以进行下一步工作注意,混编必须是m函数function的形式才能被调用。上述函数简单测试一下,没有问题(复杂的函数一定要多测试,否则后续调试常困难).继续下一步.5 .2第二步:在Matlab中使用deploytool建立混编项目在Matlab工作区输入命令:deploytooL然后得到下面界面,输入混编项目的名称,选择 存储位置,关键的是类型那里一定要选择.NET Assembly,如下图所示: dep
33、loytool选择0K之后,下一步matlab界面右侧会出现项目解决方案,需要添加类名称和M文件。这个类名称,就是编译完成之后C#项目中的类对象名称,然后添加我们刚才上一步编 写的PlotTest.m,然后编译即可,如下图所示:.NET Assembly3 PlotTestprj国财Build ! Packagelasses()TestDemoPlotTestmAdd filesAdd Classi到此为止,一个常规简单的Matlab.NET混编已经完成了 60%了。编译完成之后,打开Package选项卡,即可看到生成的dll文件,然后点击右键,打开文件夹即可,如下图目标:.NET Assem
34、bly国 PlotTestprj 口 Build 1 Package |回回3回Package (1 KB)PlotTest_overview.htmlPlotTestNative.dll readme.txtAdd files/directoriesl4 .3查看混编生成的代码这个过程很关键,其实包含很多信息,只不过95%以上的人都没有注意到其实混编生 成的dll是有源文件的,通过查看源文件就应该知道混编的原理,只不过这是matlab自动 生成 而已。那看看生成的源码吧。打开Matlab混编项目的目录,可以看到有2个文件夹,“distrib , src 2个文件夹。distrib”文件夹就是
35、上面图中生成的dll ,注意有2个dll,l个是项目名称.dll,一彳是项目名称Native.dll这2个dll的差别可以通过“distrib”文件夹源码来观察。distrib 就是源代码的文件夹。如下图所示,src文件夹的文件示意图:名称一 mccEcdudedFiles6 PlotTest.dll=,PlotTest6 PlotTest-overview PlotTestNative.dll* PlotTestNative readme TestDemo.es TestDemoNative.es我们2.2中新建的类名是TestDemo,所以生成的的源码名称也是TestDemo,看看这2个c
36、s文件中的代码,同时类的方法也可以在VS中通过对象浏览器来查看dll有哪些方法以及方法的参数类型。直接贴这2个cs文件的代码,顺便解释和对比下:TestDemo.cs文件源码:1 /*2 * MATLAB Compiler: 4. 17 (R2012a)3 * Date: Mon Sep 09 16:19:01 20134 * Arguments: -B macro_default -W,zdotnet:PlotTest, TestDemo, 0. 0, private -T5 *“D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTestsrc -w6 * e
37、nable:specified_file_mismatch/z -z,enable:repeated_file,z -w”7 * zzenable: switch_ignored,z ,zenable:missing_lib_sentinel-w” enable: demo_license,z8 * -v“classTestDemo:D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTest. m)9 */10 using System;11 using System. Reflection;12 using System. 10;13 using MathWo
38、rks. MATLAB. NET. Arrays;14 using MathWorks. MATLAB. NET. Utility;1516 #if SHARED17 assembly: System. Reflection. AssemblyKeyFile(z,/)18 #endif1920 namespace PlotTest21 2223 III summary)24 III The TestDemo class provides a CLS compliant, MWArray interface to the M-functions25 / contained in the file
39、s:26 III27 IIID:WorkDevelopMent SVNMatlabMatlabBlogPlotTest. m28 III29 IIIdeployprint, m30 III31 IIIprintdig. m32 III33 III34 IIIVersion 0. 035 /36 public class TestDemo : IDisposable37 (38 #region Constructors3940 III41 IIIThe staticconstructorinstantiates and initializes theMATLAB Compiler Runtime
40、42 IIIinstance.43 III44 static TestDemo()45 (46 if (MWMCR. MCRAppInitialized)47 48 Assembly assembly= Assembly. GetExecutingAssembly();4950 string ctfFilePath= assembly. Location;5152 int lastDelimiter= ctfFilePath. LastlndexOf (,zz,);5354 ctfFilePath= ctfFilePath. Remove(lastDelimiter,(ctfFilePath.
41、 Length - lastDelimiter);5556 string ctfFileName = PlotTest. ctf”;5758 Stream embeddedCtfStream = null;5960 String resourceStrings =assembly. GetManifestResourceNames();6162 foreach (String name in resourceStrings)63 64 if (name. Contains(ctfFileName)65 (66 embeddedCtfStream =assembly. GetManifestRe
42、sourceStream(name);67 break;68 )69 )70 mcr= new MWMCR(,71 ctfFilePath, embeddedCtfStream, true);72 )73 else74 75 throw new ApplicationException(,zMWArray assembly could notbe initialized);76 )77)787980 III81 /Constructsa new instance of the TestDemo class.82 III83 publicTestDemo()84(85)868788 ttendr
43、egion Constructors8990Sregion Finalize9192 III 93 III Class destructor called by the CLR garbage collector.949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136/ TestDemo() (Dispose(false);III III Frees the native resources associated with this object / public void Dispose() (Dispose(true);GC. SuppressFinalize(this);/ summary internal= true/ Internal dispose function/ /summaryprotected virtual void Dispose (bool disposing)(if (disposed)disposed= true;if (disposing)(/ Free managed resources;)/ Free native resourc