关于matlab与c#混合编程的问题

上传人:沈*** 文档编号:146703009 上传时间:2022-08-31 格式:DOCX 页数:54 大小:741.51KB
返回 下载 相关 举报
关于matlab与c#混合编程的问题_第1页
第1页 / 共54页
关于matlab与c#混合编程的问题_第2页
第2页 / 共54页
关于matlab与c#混合编程的问题_第3页
第3页 / 共54页
点击查看更多>>
资源描述
关于matlab与c#混合编程的问题2012-06-06 00:45shulai1008|浏览 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.Arrays;/在MWArray.dll,最常用的using MathWorks.MATLAB.NET.Utility;/ 在MWArray.dll,最常用的using test_erfc;/ 我在matlab中采样deploytool编译成test_erfc.dllnamespace erfccc class Program static void Main(string args) test_erfc.test_erfcclass E = new test_erfcclass(); Console.WriteLine(输入x的值:); int x = Convert.ToInt32(Console.ReadLine(); MWArray result = E.erfc(1, (MWArray)x); /第一个参数取决于你的erfc有几个返回参数 MWNumericArray r1 = (MWNumericArray)result0; double, location1 = (double,)r1.ToArray(MWArrayComponent.Real); Console.WriteLine(location10, 0.ToString(); Console.ReadLine(); 追问:我的意思是如何将如sin(x)/x这样的表达式传递给matlab,完成从c#中输入表达式和积分上下限求积分的功能追答:这个我就不懂了,我也不知道能不能实现,如果是将表达式在matlab代码中固定,在C#中只传积分上下限的话可以实现追问:嗯,那也还是谢谢你了追答:如果你的函数有限,建议你还是写在matlab程序里,通过整型参数来识别用哪个函数Matlab和C#混合编程作者:gxyfish(站内联系TA) 发布: 2013-11-14在实验室算法演示和工程应用中存在这样的困惑:1. Matlab精通各种数值计算和算法,但是没有优美的界面,更不用说对数据库访问操作。2.Visual studio(C#)拥有完美的界面编程,窗口或网络编程已经优越的数据库访问等优势。-3. 国外有一本书叫:MATLAB C# Book图书(已经放到压缩包中了),看过以后收获不少。4. 结合各种材料,我使用visual studio 2012+ matlab 2013a实现了从Winfrom调用Matlab命令行绘图Winfrom调用 .m文件编译的dll并在webBrowser中显示结果调用Matlab命令demo调用Dll demo解决方案结构压缩包中包含MATLABCSharp.pdf【原创】Matlab与.NET基于类型安全的接口混合编程入门回到目录1.前言MatlabBuilderNE工具箱是与C#混编的工具箱,里面的帮助文档很详细,提供了4种情况下与.NET混合编程的案例。1.是简单的组件集成,通过Matlab生成Dll程序集,在.NET环境中,通过MWArray组件来调用;2.还有一个是在Web环境下使用Figure和混编的情况,与1比较类似;3.另外一个就是我们今天要讲到的基于类型安全的接口编程,以及对WCF和MEF的支持;4.最后一个是在.NETRemoting技术中的使用。在初级入门教程中,以及我现在的混编开发中,都只是用到了第1个方法,和很简单,也很快,当然要你掌握了很多基础技术之后才能达到这个水平。今天要见到的基于接口的编程,有一个很大的好处就是可以避免类型转换,因为之前的方法都有大量的.NET和Matlab类型进行转换,基础不扎实的朋友很容易搞混淆。而基于接口的编程,则可以避免很多问题,但同时也对基础提出了更高的要求,要对接口定义,作用,以及方法多态等面向对象的特性更加了解。下面截图是在Matlab帮助的说明:回到目录2.Type-SafeInterfaces简单说明与直接编译为.NET程序集的要求不同,使用这项技术对.NET程序员的要求小很多,只需要很少的Matlab知识,但要对.NET技术精通,之前由于Matlab的数据类型和.NET的基本数据类型不兼容,所以为了使得Matlab和.NET程序进行数据通信,就需要使用下面的技术:1)Marshaldatafrom.NETinputdatatoadeployedfunctionbycreatinganMWArrayobjectfromnative.NETdata.ThepublicfunctionsinadeployedcomponentreturnMWArrayobjects.2)MarshaltheoutputMATLABdatainanMWArrayintonative.NETdatabycallingoneoftheMWArraymarshalingmethods(ToArray(),forexample).所以使用传统的混编方式,又很多数据类型转换的过程。而在使用Type-SafeInterfaces技术后,这些中间过程都可以忽略,只需要关系输入的.NET类型以及输出的.NET类型结果,Matlab会对数据进行内部的转换处理。可以看看前后2副图的对比:因此,我们可以很明显的看到Type-SafeInterfaces带来的优势:YouavoidtrainingandcodingcostsassociatedwithteachingenduserstoworkwithMWArrays.YouminimizecostofdatayoumustmarshalbyeitherplacingMWArrayobjectsintype-safeinterfacesorbycallingMWArray-basedfunctionsinthedeployedcomponent.Flexibilityyoumixtype-safeinterfaceswithmanualdatamarshalingtoaccommodatedataofvaryingsizesandaccesspatterns.Forexample,youmayhaveafewlargedataobjects(images,forexample)thatwouldincurexcesscosttoyourorganizationifmanagedwithatype-safeinterface.Bymixingtype-safeinterfacesandmanualmarshaling,smallerdatatypescanbemanagedautomaticallywiththetype-safeinterfaceandyourlargedatacanbemanagedonanas-neededbasis.回到目录3.Type-SafeInterfaces实际案例对这个混编方式,很显示可以节省很多事情,我认为,作为原始的数据类型转换方式,还是应该掌握的。在掌握了之后,再使用这个方法,会事半功倍,毕竟不是所有的问题都可以用接口解决。接下来,就让我们一起用一个小的编程实例,来演示整个过程的使用。演示环境:VisualStudio2010,Matlab2012a,.NET4.0演示内容:一个简单的乘法运算混编实现一、新建一个类库类型的项目,名称MatlabDemo,.NET4.0,如下图所示:一、在上面的项目中添加一个接口文件IMultiply.cs,并编写下面的代码,因为我们实现的是一个简单的乘法,所以添加如下几个接口方法: 1 namespace MatlabDemo 2 3 / 乘法接口 4 public interface IMultiply 5 6 /2个数直接相乘 7 double multiply(double x, double y); 8 9 /数组相乘 10 double multiply(double x, double y);11 12 /矩阵相乘 13 double, multiply(double, x, double, y); 14 15 这里注意,一定要将接口的可访问性设置为Public,否则混编的时候,Matlab会找不到接口原型,编译失败。编写好,编译项目即可,会在bin文件夹下得到MatlabDemo.dll文件,这个文件下面的步骤会用到。三、编写M函数,并设置混编项目。我们编写一个简单的乘法M函数m,如下所示:1 function z = multiply(x, y)2 3 z = x * y;注意这里的名称一定要和接口方法的名称对于起来,否则Matlab怎么会认识,想想就明白了。然后在Matlab中输入deploytool命令,输入项目名称:TypeSaftDemo,并选择项目类型:.NETAssembly,这个过程是“混编三部曲”基本过程,以前的视频中专门见到了,不仔细说明,如下图所示:确定之后,混编项目基本就建立了,然后新建一个类DemoTest,并把上面编写的multiply.m函数添加到这个类中去,这其实就是一个常规的混编过程,很简单。添加完成之后,如果是普通的混编方式,直接编译就可以了,但基于接口的混编方式,还有一个过程要设置,看下图,单击混编项目的设置(Settings.):如下图,打开设置后,选择“TypeSafeAPI”选项卡:首先,选择我们在第一个过程中编写好的MatlabDemo.dll接口文件,选择后,程序会自动搜索该dll中的可用接口(公开的),在.NETinterface下拉列表中显示,选择你需要的,这里我们是IMultiply,如下图所示的MatlabDemo.IMultiply,然后选择该接口和Matlab混编程序中对于的类,我们的multiply.m函数在DemoTest类中,如下图的Wrappedclass:设置完成之后,关闭即可。然后编译,如果没有问题,提示编译成功之后,打开编译好的文件夹,我们可以看到如下3个dll文件:生成的3个文件,TypeSafeDemo.dll其实和普通的混编方式是一样的,可以和以前数据类型转换的方式一样使用;而DemoTestIMultiply.dll和TypeSafeDemoNative.dll这2个一起使用,Matlab已经在内部将数据转换过程封装好了,直接使用即可。第一种方式就不演示了,直接演示如何用接口来计算乘法。五、C#调用混编好的dll计算结果。在上一节中我们已经说明了几个dll的作用,下面将演示他们的用法,将DemoTestIMultiply.dll和TypeSafeDemoNative.dll一起复制到测试项目的C#项目中去(新建一个控制台测试项目),分别添加这几个dll的引用:MWAarray.dll和DemoTestIMultiply.dll以及TypeSafeDemoNative.dll。然后添加命名空间,具体核心代码如下所示: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 using MathWorks.MATLAB.NET.Arrays; 7 using MathWorks.MATLAB.NET.Utility; 8 9 using TypeSaftDemo;10 11 namespace TypeSaftTest12 13 class Program14 15 static void Main(string args)16 17 /混编接口类的实例化18 DemoTestIMultiply di = new DemoTestIMultiply();19 double, a = new double2,2 1,2,3,4 ;20 double, b = new double2, 2 6, 7 , 8, 9 ;21 /分别演示接口的3种不同调用22 var t1 = di.multiply(3, 5);23 var t2 = di.multiply(new double 1, 2, 3 , 5);24 var t3 = di.multiply(a, b);25 Console.WriteLine(2个数直接相乘:+t1.ToString();26 Console.Write(数组与单个数直接相乘:);27 foreach (var item in t2 ) Console.Write(item.ToString()+ );28 Console.WriteLine();29 Console.Write(矩阵乘法:);30 foreach (var item in t3) Console.Write(item.ToString() + );31 Console.ReadKey ();32 33 34 结果如下图所示:上面就是Matlab和C#基于接口的混合编程的详细过程,混编是一个很有用的工具,但要用好,其实真的很难,接触混编这么长的时间以来,碰到过很多同学使用这个工具,绝大部分是误用,导致无故的工作量。要想混编成为自己工作和学习的得力助手,必须加强Matlab和.NET基础的学习,只有2者的基础掌握好了,足够熟悉这2个平台,你才可能更顺利的解决混编过程中遇到的问题。当混编出了问题的时候,需要很多经验才能度过难关,这一点很重要,不要指望学会这个过程,就可以解决所有问题。期待Mathworks公司对Matlab的混编编程支持越来越强大。【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数1.传统的Matlab.NET混合编程步骤传统的Matlab.NET混合编程有2种方式:1)Matlab编写好M函数,利用deploytool编译m函数生成dll,在C#项目中引用并调用;2)基于接口的编写方式,也是利用deploytool工具,过程繁琐一点,对编程人员素质要求高一点,但不需要进行繁琐的数据类型转换。我的博客有一篇文章专门介绍了这个混合编程方式,也有例子,大家有兴趣的可以看看:不管上面用哪种方式,Matlab和C#混编的基本步骤,大概都是下面的过程:1)编写M函数,并首先在Matlab中测试是正确可以调用的。注意命名规范,注释规范;2)使用命令打开deploytool工具,设置项目名称,选择类型:.NETAssembly,然后新建一个类,并添加编写好的M函数3)编译,生成dll,并在C#项目中添加引用(还需要引用对应版本的MWArray),利用对象浏览器查看生成dll的方法结构,并根据Matlab和C#的类型转换规则,进行数据转换即可,如果是接口的编程,这个过程相对要简单。回到目录2.深入解析传统混编所生成的代码2.1 第一步:编写M函数,并测试可以使用为了好我们今天的目的相匹配,特意封装一个简单的内置函数,plot,来画一个简单的图形,如下所示M函数1 function PlotTest(n)2 %编写一个简单的函数,对plot进行简单封装一下3 plot(1:n,1:n);4 %测试正确,才可以进行下一步工作注意,混编必须是m函数function的形式才能被调用。上述函数简单测试一下,没有问题(复杂的函数一定要多测试,否则后续调试非常困难)。继续下一步。2.2 第二步:在Matlab中使用deploytool建立混编项目在Matlab工作区输入命令:deploytool,然后得到下面界面,输入混编项目的名称,选择存储位置,关键的是类型那里一定要选择.NET Assembly。如下图所示:选择“OK”之后,下一步matlab界面右侧会出现项目解决方案,需要添加类名称和M文件。这个类名称,就是编译完成之后C#项目中的类对象名称,然后添加我们刚才上一步编写的“PlotTest.m”,然后编译即可,如下图所示:到此为止,一个常规 简单的Matlab.NET混编已经完成了60%了。编译完成之后,打开“Package”选项卡,即可看到生成的dll文件,然后点击右键,打开文件夹即可,如下图所示:2.3 查看混编生成的代码这个过程很关键,其实包含很多信息,只不过95%以上的人都没有注意到其实混编生成的dll是有源文件的,通过查看源文件就应该知道混编的原理,只不过这是matlab自动生成 而已。那看看生成的源码吧。打开Matlab混编项目的目录,可以看到有2个文件夹,distrib”,“src”2个文件夹。distrib文件夹就是上面图中生成的dll,注意有2个dll,1个是“项目名称.dll”,一个是“项目名称Native.dll”,这2个dll的差别可以通过distrib文件夹源码来观察。“distrib”就是源代码的文件夹。如下图所示,src文件夹的文件示意图:我们2.2中新建的类名是TestDemo,所以生成的的源码名称也是TestDemo,看看这2个cs文件中的代码,同时类的方法也可以在VS中通过对象浏览器来查看dll有哪些方法以及方法的参数类型。直接贴这2个cs文件的代码,顺便解释和对比下:TestDemo.cs文件源码: 1 /* 2 * MATLAB Compiler: 4.17 (R2012a) 3 * Date: Mon Sep 09 16:19:01 2013 4 * Arguments: -B macro_default -W dotnet:PlotTest,TestDemo,0.0,private -T 5 * link:lib -d D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTestsrc -w 6 * enable:specified_file_mismatch -w enable:repeated_file -w 7 * enable:switch_ignored -w enable:missing_lib_sentinel -w enable:demo_license 8 * -v classTestDemo:D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTest.m 9 */ 10 using System; 11 using System.Reflection; 12 using System.IO; 13 using MathWorks.MATLAB.NET.Arrays; 14 using MathWorks.MATLAB.NET.Utility; 15 16 #if SHARED 17 assembly: System.Reflection.AssemblyKeyFile() 18 #endif 19 20 namespace PlotTest 21 22 23 / 24 / The TestDemo class provides a CLS compliant, MWArray interface to the M-functions 25 / contained in the files: 26 / 27 / D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTest.m 28 / 29 / deployprint.m 30 / 31 / printdlg.m 32 / 33 / 34 / Version 0.0 35 / 36 public class TestDemo : IDisposable 37 38 #region Constructors 39 40 / 41 / The static constructor instantiates and initializes the MATLAB Compiler Runtime 42 / instance. 43 / 44 static TestDemo() 45 46 if (MWMCR.MCRAppInitialized) 47 48 Assembly assembly= Assembly.GetExecutingAssembly(); 49 50 string ctfFilePath= assembly.Location; 51 52 int lastDelimiter= ctfFilePath.LastIndexOf(); 53 54 ctfFilePath= ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter); 55 56 string ctfFileName = PlotTest.ctf; 57 58 Stream embeddedCtfStream = null; 59 60 String resourceStrings = assembly.GetManifestResourceNames(); 61 62 foreach (String name in resourceStrings) 63 64 if (name.Contains(ctfFileName) 65 66 embeddedCtfStream = assembly.GetManifestResourceStream(name); 67 break; 68 69 70 mcr= new MWMCR(, 71 ctfFilePath, embeddedCtfStream, true); 72 73 else 74 75 throw new ApplicationException(MWArray assembly could not be initialized); 76 77 78 79 80 / 81 / Constructs a new instance of the TestDemo class. 82 / 83 public TestDemo() 84 85 86 87 88 #endregion Constructors 89 90 #region Finalize 91 92 / 93 / Class destructor called by the CLR garbage collector. 94 / 95 TestDemo() 96 97 Dispose(false); 98 99 100 101 / 102 / Frees the native resources associated with this object103 / 104 public void Dispose()105 106 Dispose(true);107 108 GC.SuppressFinalize(this);109 110 111 112 / 113 / Internal dispose function114 / 115 protected virtual void Dispose(bool disposing)116 117 if (!disposed)118 119 disposed= true;120 121 if (disposing)122 123 / Free managed resources;124 125 126 / Free native resources127 128 129 130 131 #endregion Finalize132 133 #region Methods134 135 / 136 / Provides a void output, 0-input MWArrayinterface to the PlotTest M-function.137 / 138 / 139 / M-Documentation:140 / 编写一个简单的函数,对plot进行简单封装一下141 / 142 /143 public void PlotTest()144 145 mcr.EvaluateFunction(0, PlotTest, new MWArray);146 147 148 149 / 150 / Provides a void output, 1-input MWArrayinterface to the PlotTest M-function.151 / 152 / 153 / M-Documentation:154 / 编写一个简单的函数,对plot进行简单封装一下155 / 156 / Input argument #1157 /158 public void PlotTest(MWArray n)159 160 mcr.EvaluateFunction(0, PlotTest, n);161 162 163 164 / 165 / Provides the standard 0-input MWArray interface to the PlotTest M-function.166 / 167 / 168 / M-Documentation:169 / 编写一个简单的函数,对plot进行简单封装一下170 / 171 / The number of output arguments to return.172 / An Array of length numArgsOut containing the output173 / arguments.174 /175 public MWArray PlotTest(int numArgsOut)176 177 return mcr.EvaluateFunction(numArgsOut, PlotTest, new MWArray);178 179 180 181 / 182 / Provides the standard 1-input MWArray interface to the PlotTest M-function.183 / 184 / 185 / M-Documentation:186 / 编写一个简单的函数,对plot进行简单封装一下187 / 188 / The number of output arguments to return.189 / Input argument #1190 / An Array of length numArgsOut containing the output191 / arguments.192 /193 public MWArray PlotTest(int numArgsOut, MWArray n)194 195 return mcr.EvaluateFunction(numArgsOut, PlotTest, n);196 197 198 199 200 / 201 / This method will cause a MATLAB figure window to behave as a modal dialog box.202 / The method will not return until all the figure windows associated with this203 / component have been closed.204 / 205 / 206 / An application should only call this method when required to keep the207 / MATLAB figure window from disappearing. Other techniques, such as calling208 / Console.ReadLine() from the application should be considered where209 / possible.210 /211 public void WaitForFiguresToDie()212 213 mcr.WaitForFiguresToDie();214 215 216 217 218 #endregion Methods219 220 #region Class Members221 222 private static MWMCR mcr= null;223 224 private bool disposed= false;225 226 #endregion Class Members227 228 TestDemoNative.cs文件源码: 1 /* 2 * MATLAB Compiler: 4.17 (R2012a) 3 * Date: Mon Sep 09 16:19:01 2013 4 * Arguments: -B macro_default -W dotnet:PlotTest,TestDemo,0.0,private -T 5 * link:lib -d D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTestsrc -w 6 * enable:specified_file_mismatch -w enable:repeated_file -w 7 * enable:switch_ignored -w enable:missing_lib_sentinel -w enable:demo_license 8 * -v classTestDemo:D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTest.m 9 */ 10 using System; 11 using System.Reflection; 12 using System.IO; 13 using MathWorks.MATLAB.NET.Arrays; 14 using MathWorks.MATLAB.NET.Utility; 15 16 #if SHARED 17 assembly: System.Reflection.AssemblyKeyFile() 18 #endif 19 20 namespace PlotTestNative 21 22 23 / 24 / The TestDemo class provides a CLS compliant, Object (native) interface to the 25 / M-functions contained in the files: 26 / 27 / D:WorkDevelopMent_SVNMatlabMatlabBlogPlotTest.m 28 / 29 / deployprint.m 30 / 31 / printdlg.m 32 / 33 / 34 / Version 0.0 35 / 36 public class TestDemo : IDisposable 37 38 #region Constructors 39 40 / 41 / The static constructor instantiates and initializes the MATLAB Compiler Runtime 42 / instance. 43 / 44 static TestDemo() 45 46 if (MWMCR.MCRAppInitialized) 47 48 Assembly assembly= Assembly.GetExecutingAssembly(); 49 50 string ctfFilePath= assembly.Location; 51 52 int lastDelimiter= ctfFilePath.LastIndexOf(); 53 54 ctfFilePath= ctfFilePath.Remove(lastDelimiter, (ctfFilePath.Length - lastDelimiter); 55 56 string ctfFileName = PlotTest.ctf; 57 58 Stream embeddedCtfStream = null; 59 60 String resourceStrings = assembly.GetManifestResourceNames(); 61 62 foreach (String name in resourceStrings) 63 64 if (name.Contains(ctfFileName) 65 66 embeddedCtfStream = assembly.GetManifestResourceStream(name); 67 break; 68 69 70 mcr= new MWMCR(, 71 ctfFilePath, embeddedCtfStream, true); 72 73 else 74 75 throw new ApplicationException(MWArray assembly could not be initialized); 76 77 78 79 80 / 81 / Constructs a new instance of the TestDemo class. 82 / 83 public TestDemo() 84 85 86 87 88 #endregion Constructors 89 90 #region Finalize 91 92 / 93 / Class destructor called by the CLR garbage collector. 94 / 95 TestDemo() 96 97 Dispose(false); 98 99 100 101 / 102 / Frees the native resources associated with this object103 / 104 public void Dispose()105 106 Dispose(true);107 108 GC.SuppressFinalize(this);109 110 111 112 / 113 / Internal dispose function114 / 115 protected virtual void Dispose(bool disposing)116 117 if (!disposed)118 119 disposed= true;120 121 if (disposing)122 123 / Free managed resources;124 125 126 / Free native resources127 128 129 130 131 #endregion Finalize132 133 #region Methods134 135 / 136 / Provides a void output, 0-input Objectinterface to the PlotTest M-function.137 / 138 / 139 / M-Documentation:140 / 编写一个简单的函数,对plot进行简单封装一下141 / 142 /143 public void PlotTest()144 145 mcr.EvaluateFunction(0, PlotTest, new Object);146 147 148 149 / 150 / Provides a void output, 1-input Objectinterface to the PlotTest M-function.151 / 152 /
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!