《matlab与c#混合编程.pdf》由会员分享,可在线阅读,更多相关《matlab与c#混合编程.pdf(5页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、引进完该dll 后,就可以开始调用matlab 里面编写那些函数了。但引用时有几个要注意的地方:1,matlab 里面的函数返回值无论是不是矩阵,在C#里面都是得到一个MWArray 数组,MWArray a=fun();(假设 fun 是 matlab dll 里面的函数,返回值是一个矩阵,在 C#里面应该用 MWArray 数组来装该矩阵)。2,matlab 传进去的矩阵参数都是MWArray 类型的,如果往matlab 里面的函数穿参数时,就应该这样写:fun2(a0);(假设 fun2 是 matlab dll 里面的另一个函数),这样,就可以将一个矩阵传到函数里面。3,在使用从mat
2、lab 里面计算得到的矩阵,也就是利用MWArray 数组时,可以参考以下两行 代 码:MWNumericArray temp=(MWNumericArray)a0;double,Matrix=(double,)temp.ToArray(MWArrayComponent.Real);/location是下标从0 开始的矩阵Matrix就是可以在C#里面直接调用的矩阵了,也就是一个二维数组了。基本上就是这些了,能传进去参数,能得到参数,就行了 Matlab 有强大的运算功能,在界面制作上则稍显逊色,借助其他编程语言(如C#,VB 等)制作界面进行合理的分工会使程序效率更高,更加优秀。我试了一下用
3、Matlab 和 C#混合编程,一路坎坷,终于走过来。由于愚钝,犯了很多低级错误。想在 C#里面调用Matlab 程序,需先将 matlab 中的程序编译成dll 文件,然后就可以在C#工程里面调用。制作dll 文件,现在matlab中 建 立 一 个 工 程,filenewDevelopment ProjectMatlab Builder NE.Net Component。然后再这个工程里编写相应的函数,编写完后,只需点击下图中的那个小图标,就可以生成相应的dll。只需到工程相应的目录下(.src)就可以找到dll,把他引用到C#工程里面就可以了。C#工程具体的引用就不赘述了。引入C#工程之
4、后,就画界面,写逻辑吧。但是,在使用Matlab 那些 dll 里面那些函数之前,要往工程里面引用另一个dll 文件那就是MW Array.dll文件,具体的路径是这样的:MATLABR2007atoolboxdotnetbuilderbinwin32v2.0下的 MWArray.dll。本 文 来 自:高 校 自 动 化 网(W)详 细 出 处 参 考(转 载 请 保 留 本 链 接):http:/ 2007a,2007b,2008a,2008b等都对开发独立于Matlab 运作平台的Matlab 应用程序有很好的支持。网址 下提供了一些Matlab 程序展开应用的实例,其中把纯的Matla
5、b 程序转换成独立执行的应用程序显得很简单。由于用Visual C#调用 Matlab 的资料不多,经过初步探索,本文对这个问题用一个实例做个记录。需要的工具:Matlab,Matlab Builder NE Toolbox,Matlab Compiler Toolbox,Visual C#首先编写一个简单的Matlab 函数,如下,并存为sumab.m(默认时存到Matlab 的默认工作目录下)function tsum=sumab(a,b)tsum=sum(a,b);下面说明如何用VC#来调用这个函数。在 Matlab 的 Command Window下运行 mbuild setup 和
6、deploytool,详细步骤参见 setup 时,让系统自动搜索编译器就可以了。deploytool 运行后,取一个工程名test_combination_matlab_c,选择.NET Component,会生成一个新工程。把 sumab.m 加入到新工程中,然后Build,工程目录下的Distrib 目录里就会有test_combination_matlab_c.dll,可以供 VC#使用。也可以Build Matlab里面自带的库函数,就如例子 所做的。打开 Visual Studio,新建一个VC#工程,笔者建的是Test 项目。建好后,在Solution Explorer里,鼠标右
7、键单击References-Add References-Browse,加入生成的test_combination_matlab_c/Distrib/test_combination_matlab_c.dll;重复操作,加入Matlab 目录下的另一个dll 文件,/toolbox/dotnetbuilder/bin/win32/v2.0/MWArray.dll。上面把该有的环境都设置好了,剩下的就是编程了。打开VC#工程里的主文件UnitTest1.cs,如果用其他类型的项目,相应打开项目的主文件。文件的开始部分加入using MathWorks.MATLAB.NET.Arrays;如要画图
8、,加using MathWorks.MATLAB.NET.Utility;在主文件的主程序public void TestMethod1()里,加MWArray a=1,b=2,c;test_combination_matlab_c.Test_combination_matlab_c sumob=new test_combination_matlab_c.Test_combination_matlab_c();c=sumob.sumab(a,b);在 Debug 时,加入BreakPoint,配合 Quick Watch,就可以看到c 值为 3.这样,一个简单的调用程序就编好了。如果是数组矩阵
9、,可以如下编写:MWNumericArray aa=new double2,2 1,2,3,4 ;MWNumericArray bb=new double2,2 1,2,3,4 ;MWArray cc;cc=sumob.sumab(MWArray)aa,(MWArray)bb);注意数据类型的转换doubleMWNumericArrayMWArray,参照网址 如果输入数组矩阵复杂,可以先在Matlab 定义,再输入到VC#中。一个简单的输入如下所示,并存之为definematrixes.m function a,b=definematrixes()a=1 2;3 4;b=3 4;5 6;把
10、definematrixes.m加入 deploytool当前工程(test_combination_matlab_c.),重新 build 之后,转到VC#的项目,在主程序中加入下面代码:MWArray aaa,bbb,ccc;MWArray tempmatrix;tempmatrix=sumob.definematrixes(2);aaa=tempmatrix0;bbb=tempmatrix1;ccc=sumob.sumab(aaa,bbb);这样,在 Debug 时,可以看到ccc=4,6,8,10。这里有个小问题没解决,aaa.Dimension和 bbb.Dimension都是 2*
11、2,不知为何,ccc 就成了 1*4 了。如果没有好的方法,可以用Matlab 的 reshape 函数把 1*4 维变回 2*2 维的矩阵 只是要把reshape 也加入到deploytool 的工程 test_combination_matlab_c中。对单一数据(非数列和矩阵),笔者用 form 的方法实现了用户的输入输出。首先,新建一个基于Windows Form的项目,在Form 里面,加入三个Label,三个 Textbox 组件以及一个Button 组件(组件的大小位置刚开始可以随意些),再把下面的程序拷贝进 Form1.cs即可 同样的要在References里头加入 MWAr
12、ray.dll和test_combination_matlab_c.dll。using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using MathWorks.MATLAB.NET.Arrays;using MathWorks.MATLAB.NET.Utility;namespace Matlab_
13、csharp_Forms_Application public partial class Form1:Form public Form1()InitializeComponent();private void Form1_Load(object sender,EventArgs e)this.label1.Visible=false;this.textBox1.Visible=false;this.label2.Visible=false;this.label3.Visible=false;private void button1_Click(object sender,EventArgs
14、e)MWArray a=1,b=2,c;test_combination_matlab_c.Test_combination_matlab_c sumob=new test_combination_matlab_c.Test_combination_matlab_c();try a=System.Convert.ToDouble(this.textBox2.Text);b=System.Convert.ToDouble(this.textBox3.Text);c=sumob.sumab(a,b);this.label1.Visible=true;this.textBox1.Visible=tr
15、ue;this.textBox1.ReadOnly=true;this.textBox1.Text=c.ToString();this.label2.Visible=false;this.label3.Visible=false;catch(System.FormatException)this.label1.Visible=false;this.textBox1.Visible=false;this.label2.Visible=true;this.label3.Visible=true;/Statements for handling the exception 由于不清楚Visual C#如何显示数列和矩阵,大的数据可能输出到Excel 或 SQL 会是不错的选择,至于输入,也许可以考虑在Matlab 中写输入数据的函数(如上所述);熟悉 VC#者或许可以给出适合的答案。VC#和 Matlab 各有所强,两者的结合,应该会是科研和各种应用程序开发很有效的工具。
限制150内