Matlab与C混合编程详细资料_第1页
Matlab与C混合编程详细资料_第2页
Matlab与C混合编程详细资料_第3页
Matlab与C混合编程详细资料_第4页
Matlab与C混合编程详细资料_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

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

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

3、具体的可能需要经过实验才能符合各自的要求。虽然matab对.net的支持不如它对c+支持的功能强大,但也已经满足了我们实际应用的需求。如果我们可以把大部分的运算都放在matlab里面完成,数据转换的数量又少,那么整个系统的运行速度与效率还是挺高的。 c#与matlab混合编程图解using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;namespace ConsoleApplication1    class Progr

4、am            static void Main(string args)                    Program p = new Program();            p.Ma

5、tlabTest();            Console.WriteLine("按任意键退出.");            Console.ReadKey();                 &

6、#160;     / <summary>        / 测试C# matlab调用        / </summary>        private void MatlabTest()            

7、;        Console.WriteLine("正在载入matlab for .NET库.");            DotNetTest.DotNetTestclass dt = new DotNetTest.DotNetTestclass();            Cons

8、ole.WriteLine("完成.");            Console.WriteLine("-");                             

9、       / 多项式            int demention = 3;            double dd = new doubledemention;            dd0 = 1

10、;            dd1 = 4;            dd2 = 6;            /MathWorks.MATLAB.NET.Arrays.MWArray d =       

11、     /    MathWorks.MATLAB.NET.Arrays.MWNumericArray.MakeSparse(            /    1, demention, MathWorks.MATLAB.NET.Arrays.MWArrayComplexity.Real, demention);      &

12、#160;     MathWorks.MATLAB.NET.Arrays.MWNumericArray d = (MathWorks.MATLAB.NET.Arrays.MWNumericArray)dd;            Console.WriteLine("开始计算多项式:0 .", d.ToString();         

13、;   / 存储计算结果            MathWorks.MATLAB.NET.Arrays.MWArray h;            / 调用matlab函数计算            h = dt.myroots(d); &

14、#160;          / 取得实部             Array real = (MathWorks.MATLAB.NET.Arrays.MWNumericArray)h).ToArray(MathWorks.MATLAB.NET.Arrays.MWArrayComponent.Real);        

15、;    string realpart = "实部列表:"            foreach (double i in real)                          &

16、#160; realpart += i + "t"                        / 取得虚部             Array imaginary = (MathWorks.MATLAB.NET.Arrays.MWNumericA

17、rray)h).ToArray(MathWorks.MATLAB.NET.Arrays.MWArrayComponent.Imaginary);            string imaginarypart = "虚部列表:"            foreach (double i in imaginary)    

18、;                        imaginarypart += i + "t"                      

19、0; Console.WriteLine(realpart);            Console.WriteLine(imaginarypart);            / 打印结果            Console.WriteLine("计算结果:

20、");            Console.WriteLine(h.ToString();            C#与Matlab混合编程的几种方式1. 通过从Matlab的*.m文件中生成C语言版本的DLL具体过程:1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器

21、有两个LCC和VC2008(注意如果使用VS.net做应用的话,建议编译器选VC2008,否则C#中会告诉你DLL找不到Entry Point)3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h文件中有导出的函数原型。4) 建立C#工程,并将前面的dll拷贝到合适路径,使用 DllImport( "mypluslib.dll ", CallingConvention = CallingConvention.Cdecl) 将

22、.h文件中的函数使用C#的语法声明。一般来说,这些函数中会有*Initialize,*Terminate和M文件中定义的函数(*代表lib名称)。5) 使用CsharpMatlabCompilerVer4.cs将C#中的数据类型和Matlab中的矩阵等类型进行变换。该文件定义了MatlabCSharp类,主要是导入了libmx.dll中的一些函数,并封装了一些实用的函数如double2mxArray_scalarReal等。2. C#调用Matlab工作区计算并返回结果主要使用engOpen, engClose, engPutVariable, engEvalString, engGetVar

23、iable函数进行操作。大致过程如下:MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b ;" );mx_c = MatlabCSharp.engGetVariable(ep, "ml_c" );3. 使用Matlab DeployTool生成COM组件注: 老版本的叫ComTool

24、,现在叫做DeployTool。在Command Window里面直接输入deploytool即可1) 选择New Deployment Project -> MATLAB Builder NE -> Generic COM Component 2) 添加相应的M文件3) 保存,编译4) 新建C#工程,添加Reference, Ok4. 使用Matlab DeployTool生成.Net组件1) 选择New Deployment Project -> MATLAB Builder NE -> .Net Component2) 添加相应的M文件3) 保存,编译4) 新建C

25、#工程,由于经常要using MathWorks.MATLAB.NET.Arrays;using MathWorks.MATLAB.NET.Utility;因此需添加MWArray这个Reference,一般安装玩MATLAB Builder NE就有了,放在GAC当中的。C#与Matlab混合编程(VS2005+Matlab7.5)制作dll步骤:starmatlabMatlab Builder for .netdeployment tool新建Matlab Builder for .net.Net component右键add file找目标M文件编译VS2005引用:引用编译的dll,同

26、时保持*.ctf在同一文件夹下Codeusing MathWorks.MATLAB.NET.Arrays;using MathWorks.MATLAB.NET.Utility;Codetest.testclass test = new test.testclass();MWNumericArray是MWArray和c#中数据的中间类,怎么用?怎样在C#与matlab间传递参数?a.double型、int型等数值类型的变量传递MWNumericArray i = null, result = mydouble; i=4;myClass myclass = new myClass(); /实例化r

27、esult = (MWNumericArray)myclass.myfunc(i);b.字符串(需要用到MWCharArray和MWArray转换)MWCharArray FileName = myString;MWNumericArray sensitivity;sensitivity = (MWNumericArray)myClass.myAlgorithm(MWArray)FileName);c.多个输出参数组成的数组MWNumericArray out_Arr = (MWNumericArray)out_Args1; /取出第一个参数返回的数组(matlab返回的数组下界是从1开始的)

28、取出数组中的一个元素值mydouble=out_Arri.ToScalarDouble();如上面例子ToScalarDouble一类的toXXXX等方法还有许多。d.result.toArray可以把matlab返回的矩阵变成C#的n x m数组,eg:double, csArray= (double,)result.ToArray(MWArrayComponent.Real);e.将数组传入Matlab(和传递单个数值的方法一样)double, dbx = new double2, 2 1, 2 , 3, 4 ;MWNumericArray x=dbx;myclass.picture(x)

29、;M文件如何接收和返回?function x=test(h,d)    /接收两个参数,返回一个function x1,x2=test(h,d)   /返回数组 以上为.Net方式连接,以下为COM方式连接(编译速度而言.net的方式要快上很多,而且似乎比较稳定)matlab编译工作- mbuild -setup- deploytool,Matlab Builder for .net,Generic COM Component- 添加m函数文件(eg: myfunc.m),改类名(eg: myComClass),build注册dllregsvr

30、32 myCom.dllregsvr32 mwcomutil.dllVS2005调用:- Reference加Com控件- 调用示例double, arr = null;object in_a, out_a;in_a = 500;out_a = arr1;myCom.myComClass mc = new myCom.myComClass();mc.myfunc(1, ref out_a, in_a); 小例子:(提取matlab返回的两个参数并转化为C#的矩阵)Code          &#

31、160;  testz.testzclass st = new testz.testzclass();             MWArray max = st.testz(2);             MWNumericArray x1 = (MWNumericArray)max0;     &

32、#160;       MWNumericArray x2 = (MWNumericArray)max1;            double, location1 = (double,)x1.ToArray(MWArrayComponent.Real);            double, lo

33、cation2 = (double,)x2.ToArray(MWArrayComponent.Real);             label1.Text = location11,2.ToString();其中的M文件:Codefunction x1,x2=testz()x1=1 2 3;   4 5 6;   7 8 9;x2=9 8 7;   6 5 4;  &

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

35、ork与MCR。.netframwork大家都很熟悉了,任何一个.net设计出来的程序,都不能脱离.netframwork而独立运行,正如用vc+设计的程序离不开MFC一样。这个是必须安装的。独立的.netframwork组件包可以直接去微软的网站上去找。MCR是由matlab提供的,它和.netframwork的性质相同,任何一个运行matlab的电脑上,都必须安装该组件。该组件在matlab2006a版本中已经分离开而成为一个独立的可运行的.exe文件。它一般是放在MATLABR2006atoolboxcompilerdeploywin32文件夹中,名为MCRInstaller.exe。该

36、组件其实是将MATLABR2006abinwin32文件夹下的大部分(注意不是全部).dll文件打包而已。这也是为什么有些程序在安装了MCR的机子上仍然不能运行的原因,不过对绝大多数的程序来说,一个MCR就足够了。比较保险的办法是,自行将MATLABR2006abinwin32下的所有文件打包成一个安装文件,安装完后设置好系统变量(也就是在class变量下添加上面文件的路径)。为了让用户安装程序时不需要太多的操作,我们可以把上面2个组件和应用程序一起打包,然后写个脚本检测客户端的机子是否已经安装了上面的2个组件,如果没有,则提示用户安装。检测脚本的写法很多地方都可以找到。这里就不多介绍了。 M

37、atlab和C#混合编程初探最近很想把Matlab中对图像处理的结果,在C#应用中显示出来。因此涉及到Matlab和C的混合编程问题,经历一番折腾。简单的测试程序终于通过了,期间涉及各种配置和调用问题。某些步骤的具体原因,尚没有研究明白,但是通过下面的流程是可以成功实现在C#中调用一个十分简单的Matlab函数的功能,希望在以后学习中,可以在C#中调用更多的Matlab功能。本文用Windows Live Writer编写,也顺便测试一下,呵呵! 1、Matlab(7.8.0(R2009a)版本)中新建dlldemo.m文件 funtion result = dlldemo(input); r

38、esult = 2 * input; end 2、在command window中配置分别配置>>mbuild setup和>>mex setup,编译器均选择 VS2008 SP1 3、在command window中>> deploytool 会弹出如下对话框 按照提示的流程,先创建project,选择.NET Component类型;然后把dlldemo.m文件添加到project里面,然后点上面菜单条上的build the project, 成功后会在刚才选定的project文件夹下出现两个文件夹,在distrib文件夹下有我们需要的dlldemo.

39、dll 4、接下来需要做的是,查看distrib文件下的readme 首先需要安装MCRinstaller.exe,它所在的位置是:Matlab的安装目录toolboxcompilerdeploywin32MCRInstaller.exe 5、我们还需做一个准备工作,在命令行中进入<matlabroot>/ bin/win32目录下(matlabroot为matlab安装的路径),输入regsvr32 mwcomutil.dll ,即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面我们在其他编译器下调用时就可以用了 6、在c

40、#中简单做一个windowsapplication 点击Calculate按钮后,代码是: private void button1_Click(object sender, EventArgs e) Dlldemo mydlldemo = new Dlldemo(); int i = 3; MWArray result; result = mydlldemo.dlldemo(MWArray)i);/ label2.Text = result.ToString(); 需要添加的references有dlldemo,它在上面提到的distrib文件夹中,还需要添加一个MWArray引用,它的路径

41、是Matlab安装路径toolboxdotnetbuilderbinwin32v2.0。 程序中需要引用的命名空间有: using MathWorks.MATLAB.NET.Arrays; using MathWorks.MATLAB.NET.Utility; using dlldemo;程序运行后点击Calculate按钮后结果是: 因为程序中预设i =3,所以根据matlab里面的代码,将3乘2,得到结果是6 7、Any questions you can send E-mail to me: References: 1 2 C#与Matlab混合编程 这段时间一直在折腾MATLAB,要用

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

43、esMATLABR2007atoolboxcompilerdeploywin32第二步完成编译器的设置:命令窗口输入mbuild -setup和mex -setup,都选择Microsoft Visual/c/c+ version 7.1 in "ptah loation"Microsoft Visual studio.NET 2003选项。其中ptah loation为的路径名。下面是MATLAB和C#混合编程的一个简单的例子.首先在MATLAB中写下.m程序,如下:function test(h,D)for x=-10:0.1:10   

44、if x>D        y=h;        hold on;        plot(x,y)    else if x<-D        y=-h;        hold on; &#

45、160;      plot(x,y)        else            y=h/(D*x);            hold on;         

46、60;  plot(x,y)        end    endend 保存为test_cs.m在MATLAB R2007a中输入deploytool命令(在matlab6.5中输入comtool),打开Matlab Build For .net窗口新建个工程,在此工程中“Add files”即填加test_cs.m这个文件,build即可生成COM组件,为test_cs_1_0.dll,即为我们将在C#中引用的COM组件。Build时matlab已经自动将此dll在注册表中

47、注册不过之前我们还需做一个准备工作,打开开始菜单“运行”,输入regsvr32 "matlab安装路径binwin32mwcomutil.dll",即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面 我们在其他编译器下调用时就可以用了。下面即可在C#中调用dll文件:"引用"右击,选择COM,找到test_cs_1_0.dll,填加。再写入以下代码:            matlab_c

48、s.matlab_csclassClass tc = new matlab_cs.matlab_csclassClass();            object m = 4, n = 5;            tc.test(m, n);            Co

49、nsole.ReadKey();C#与Matlab混合编程的几种方式size=12ptb1. 通过从Matlab的*.m文件中生成C语言版本的DLL/b/sizesize=12pt具体过程:/sizesize=12pt1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);/sizesize=12pt2) 使用Matlab的mbuild -setup选择编译器,我机器上的编译器有两个LCC和VC2008(注意如果使用VS.net做应用的话,建议编译器选VC2008,否则C#中会告诉你DLL找不到Entry Point)/sizesize=12pt3) 在命令行中使用mc

50、c -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h文件中有导出的函数原型。/sizesize=12pt4) 建立C#工程,并将前面的dll拷贝到合适路径,使用 DllImport( "mypluslib.dll ", CallingConvention = CallingConvention.Cdecl) 将.h文件中的函数使用C#的语法声明。一般来说,这些函数中会有*Initialize,*Terminate和M文件中定义的函数(*代表lib名

51、称)。/sizesize=+0/size size=+0size=12pt5) 使用/sizesize=12ptcolor=#0000ffCsharpMatlabCompilerVer4.cs/color/sizesize=12pt将C#中的数据类型和Matlab中的矩阵等类型进行变换。该文件定义了MatlabCSharp类,主要是导入了libmx.dll中的一些函数,并封装了一些实用的函数如double2mxArray_scalarReal等。/size/sizesize=12ptb2. C#调用Matlab工作区计算并返回结果/b/sizesize=12pt主要使用engOpen, eng

52、Close, engPutVariable, engEvalString, engGetVariable函数进行操作。/sizesize=12pt大致过程如下:/sizesize=12pt/size size=12ptcolor=#000000MatlabCSharp.engPutVariable(ep, /colorcolor=#800000"/colorcolor=#800000ml_a/colorcolor=#800000"/color/sizesize=12ptcolor=#000000, mx_a);MatlabCSharp.engPutVariable(ep,

53、/colorcolor=#800000"/colorcolor=#800000ml_b/colorcolor=#800000"/color/sizesize=12ptcolor=#000000, mx_b);MatlabCSharp.engEvalString( ep, /colorcolor=#800000"/colorcolor=#800000ml_c = ml_a + ml_b ;/colorcolor=#800000"/color/sizesize=12ptcolor=#000000 );mx_c /colorcolor=#000000=/col

54、orcolor=#000000 MatlabCSharp.engGetVariable(ep, /colorcolor=#800000"/colorcolor=#800000ml_c/colorcolor=#800000"/colorcolor=#000000 );/color/sizesize=12ptb3. 使用Matlab DeployTool生成COM组件/b/sizesize=12pt注: 老版本的叫ComTool,现在叫做DeployTool。在Command Window里面直接输入deploytool即可/sizesize=12pt1) 选择New Depl

55、oyment Project -> 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=12pt

56、2) 添加相应的M文件/sizesize=12pt3) 保存,编译/sizesize=12pt4) 新建C#工程,由于经常要/sizesize=12ptusing MathWorks.MATLAB.NET.Arrays;using MathWorks.MATLAB.NET.Utility;/sizesize=12pt因此需添加MWArray这个Reference,一般安装玩MATLAB Builder NE就有了,放在GAC当中的。/sizeC#与Matlab混合编程的几种方式主要参考资料: Matlab C# Book,我看的是第一版的电子书,网上可以搜到。   

57、;   说实话,我觉得C#与Matlab混合编程相比VC与Matlab混合编程没有啥优势,基本上还是通过P/V Invoke操作Matlab mcc编译器生成的C语言版本的DLL。此外,速度上也慢的吓人-_-     下面简单写写C#与Matlab混合编程的4种方式(可能还不够全,欢迎补充):1. 通过从Matlab的*.m文件中生成C语言版本的DLL具体过程:1) 在Matlab中写好一个m文件(比如一个简单的加法函数myplus.m);2) 使用Matlab的mbuild -setup选择编译器,我机

58、器上的编译器有两个LCC和VC2008(注意如果使用VS.net做应用的话,建议编译器选VC2008,否则C#中会告诉你DLL找不到Entry Point)3) 在命令行中使用mcc -B csharedlib:mypluslib myplus.m (如果是多个M文件,接着往后写),等待几十秒之后会生成若干文件(*.c, *.h, *.dll等), 其中.h文件中有导出的函数原型。4) 建立C#工程,并将前面的dll拷贝到合适路径,使用 DllImport( "mypluslib.dll ", CallingConvention = CallingConvention.Cd

59、ecl) 将.h文件中的函数使用C#的语法声明。一般来说,这些函数中会有*Initialize,*Terminate和M文件中定义的函数(*代表lib名称)。5) 使用CsharpMatlabCompilerVer4.cs将C#中的数据类型和Matlab中的矩阵等类型进行变换。该文件定义了MatlabCSharp类,主要是导入了libmx.dll中的一些函数,并封装了一些实用的函数如double2mxArray_scalarReal等。2. C#调用Matlab工作区计算并返回结果主要使用engOpen, engClose, engPutVariable, engEvalString,

60、0;engGetVariable函数进行操作。大致过程如下:MatlabCSharp.engPutVariable(ep, "ml_a", mx_a);MatlabCSharp.engPutVariable(ep, "ml_b", mx_b);MatlabCSharp.engEvalString( ep, "ml_c = ml_a + ml_b " );mx_c = MatlabCSharp.en

61、gGetVariable(ep, "ml_c" );3. 使用Matlab DeployTool生成COM组件注: 老版本的叫ComTool,现在叫做DeployTool。在Command Window里面直接输入deploytool即可1) 选择New Deployment Project -> MATLAB Builder NE -> Generic COM Component 2) 添加相应的M文件3) 保存,编译4) 新建C#工程,添加Reference, Ok4. 使用Matlab DeployTool生成.Net组件1) 选择Ne

62、w Deployment Project -> MATLAB Builder NE -> .Net Component2) 添加相应的M文件3) 保存,编译4) 新建C#工程,由于经常要using MathWorks.MATLAB.NET.Arrays;using MathWorks.MATLAB.NET.Utility;因此需要添加MWArray这个Reference,一般安装完matlab Builder NE就有了,放在GAC当中的。c#和matlab的混合编程(一)这段时间一直在折腾MATLAB,要用神经网络做交通方面的预测.刚开始对MATLAB这个软件是一窍不通,不过还好

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

64、n32第二步完成编译器的设置:命令窗口输入mbuild -setup和mex -setup,都选择Microsoft Visual/c/c+ version 7.1 in "ptah loation"Microsoft Visual studio.NET 2003选项。其中ptah loation为的路径名。下面是MATLAB和C#混合编程的一个简单的例子.首先在MATLAB中写下.m程序,如下:function test(h,D)for x=-10:0.1:10    if x>D    

65、0;   y=h;        hold on;        plot(x,y)    else if x<-D        y=-h;        hold on;        pl

66、ot(x,y)        else            y=h/(D*x);            hold on;            plot(x,y)   

67、     end    endend 保存为test_cs.m在MATLAB R2007a中输入deploytool命令(在matlab6.5中输入comtool),打开Matlab Build For .net窗口新建个工程,在此工程中“Add files”即填加test_cs.m这个文件,build即可生成COM组件,为test_cs_1_0.dll,即为我们将在C#中引用的COM组件。Build时matlab已经自动将此dll在注册表中注册不过之前我们还需做一个准备工作,打开开始菜单“运行”,输入regsvr

68、32 "matlab安装路径binwin32mwcomutil.dll",即对mwcomutil.dll进行注册(这个dll是matlab下作的任何com组件都要用到的dll),下面 我们在其他编译器下调用时就可以用了。下面即可在C#中调用dll文件:"引用"右击,选择COM,找到test_cs_1_0.dll,填加。再写入以下代码:            matlab_cs.matlab_csclassClass tc = new matlab

69、_cs.matlab_csclassClass();            object m = 4, n = 5;            tc.test(m, n);            Console.ReadKey();c#和matlab的混合编程(二)- C#

70、读取mat文件 在C#中读取MATLAB中mat文件存储的数组,实现.net和matlab两者之间的参数传递.这个问题困扰了我好几天,总算现在可以实现了,才发现它原来就是这么简单.和和(1)在matlab中:function temp=w101()  %表示函数有一个输出参数,没有输入参数.load w1;  temp=w1;保存为w101.m   再把w101.m做成dll文件,取名为w101data.dll注意要把w1.mat也加载在一起生成dll文件.(2)在C#中引用MWArray.dll,MWArray.dll保存在matlab安装目

71、录toolbox下,在C:Program  fileMATLABR2007atoolboxdotnetbuilderbinwin32v2.0中;(3)再在C#中引用w101data.dll文件并读取数组元素的值,代码如下: w101data.w101dataclassClass w1data = new w101data.w101dataclassClass(); object temp=new object();            

72、0;           try        w1data.w101(1, ref temp)       double, location = (double,)temp;       foreach (double a in location)   &#

73、160;                 Console.WriteLine(a);                             

74、0;          catch (Exception e)        Console.WriteLine(e.Message);  这样就基本实现了从matlab传递数据给给C#调用. 和和,下面的工作就是交通预测的算法实现了,哎,长路漫漫呀.不过我还是觉得自己可能比较适合去做研究.难道要去考研?哎,再说吧.c#和matlab的混合编程(三)-仿真的实现c#中已经可以读取mat文

75、件里的数据,但是在引用神经网络模型的程序时,总是会存在一些函数(如train,newff,sim)没有定义的错误.一直不知道如何解决在c#中引用BP网络的仿真程序(训练放在MTALAB中进行),因为在把MATLAB中仿真的程序做成DLL时,总是出现没有定义sim函数.查了很多资料也一直没有解决办法,网上很多人说是MATLAB中的编译器不支持simulink,所以在C#中引用包含sim函数的动态连接库是不能实现的.经过多番思考和实验,甚至尝试了神经网络的工具箱nnToolKit,可能是工具箱版本低(我找到的是1.0版本)的缘故,也没有成功.但是最后还是找到了解决办法,因为在MATLAB中有关于sim的定义文件,为sim.m,保存在"C:Program FilesMATLABR2007atoolboxnnetnnetnetwork"中,其中"C:Program FilesMATLABR2007a"为matlab的安装目录.只要

温馨提示

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

评论

0/150

提交评论