logo资料库

c#中调用matlab dll.pdf

第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
资料共7页,全文预览结束
C#中调用 matlab dll 作曲线拟和 2011 年 06 月 06 日 今天是端午节,闲来无事,总结一下前一段时间应用 matlab 的成果。 一、 使用环境: Visual Studio 2005,Matlab R2010b。 二、操作步骤: 1、 matlab 中安装 MCR 2、 安装 matlab 编译器 点击 MATLAB7\toolbox\compiler\deploy\win32 目录下 MCRInstaller。 安 提示安装。 在 matlab 命令行输入 mbuild -setup,设置编译器,在设置过程中会出现选 择编译器的提示,我的电脑安装的是 Microsoft Visual C++ 2005 SP1,因 此选 Microsoft Visual C++ 2005 SP1.见图 3、 运行 deploytool,编译.net dll 在 matlab 命令行输入,出现如下窗口
在 Name 中输入你将生成的 DLL 文件各,Location 中输入存入文件路径,在 Target 中点击下拉框,要发现我们可以将 matlab 文件处理成那些文件 Windows standalone application 处理 windows 成独立可运行文件 Console Application 控制台可执行文件 C Shared Library C 语言可分享库 C++ Shared Library C++语言可分享库 Excel Add-in Excel 中可调用的库 .NET Assembly .NET 编译库 Generic COM component 通用 COM 控件 Java Package Java 包 在此我们选择 .NET Assembly,确认后出现以下窗口 编译前先要设置一下,在上图中点击 Settings
设置.NET,设置如上图,选择 microsoft framwork 版本时一定要选单前使用版 本,不能选 default,要不然编译出来的会有一点问题。 将 Assembly Type 设置为 Shared 点击 Close 加到编译窗口 Add Class 中增加 invgamma Add files test.m 文件 Test.m 文件内容如下
编译文件 点击 编译结束后会在 test\src 下会产生 test.dll,这就是我们需求的 dll 文件 4、 打开 vs2005 建立 c#项目 vstest 5、 导入 matlab dll 在 Vstest 上击右键,在弹出的菜单中选择 Add Reference
按上图导入 test.dll 及 MWArray.dll, MWArray 路径如下(%matlabpath%\toolbox\dotnetbuilder\bin\win32\v2.0) 在 c#中输入以下代码 using MathWorks.MATLAB.NET.Utility; using MathWorks.MATLAB.NET.Arrays; using test; 这样就完成了 dll 的引用,接下来使用 test 中的相关功能 6、 先学习一些基本常识 matlab 中的数据与 c#中数据的传递 我们先了解一下 MWNumericArray,它是 MWArray 与 C#中数据传递的中间类。 MWNumericArray 是 MWArray 和 c#中数据的中间类,怎么用?怎样在 C#与 matlab 间传递参数? a.double 型、int 型等数值类型的变量传递 MWNumericArray i = null, result = mydouble; i=4; myClass myclass = new myClass(); //实例化 result = (MWNumericArray)myclass.myfunc(i); b.字符串(需要用到 MWCharArray 和 MWArray 转换) MWCharArray FileName = myString; MWNumericArray sensitivity; sensitivity = (MWNumericArray)myClass.myAlgorithm((MWArray)FileName); c.多个输出参数组成的数组 MWNumericArray out_Arr = (MWNumericArray)out_Args[1]; //取出第一个参数返回的数组 (matlab 返回的数组下界是从 1 开始的) 取出数组中的一个元素值 mydouble=out_Arr[i].ToScalarDouble(); 如上面例子 ToScalarDouble 一类的 toXXXX 等方法还有许多。 d.result.toArray 可以把 matlab 返回的矩阵变成 C#的 n x m 数组,eg: double[,] csArray= (double[,])result.ToArray(MWArrayComponent.Real); e.将数组传入 Matlab(和传递单个数值的方法一样) double[,] dbx = new double[2, 2] { { 1, 2 }, { 3, 4 } }; MWNumericArray x=dbx; myclass.picture(x); 7、VS 测试程序 建立以下窗口
输入以下代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using MathWorks.MATLAB.NET.Utility; using MathWorks.MATLAB.NET.Arrays; using test; namespace vstest { public partial class Form1 : Form { public Array mm; public Form1() { InitializeComponent(); //输入队列 int[] x ={0,10,20,30,40,50,60,70,80,90,100,110,120, 130,140,150,160,170,180,190,200,210,220, 230,240,250,255}; //输出队列 int[] y ={34,35,36,37,38,40,43,45,48,52,58,66,74, 83,92,105,115,129,149,168,185,198,212, 220,223,224,224 }; //0~255x轴队列 int[] p = new int[255]; for (int i = 0; i < 255; i++) { p[i] = i; }
int n = 6; //多项式项数 // int[] m = test.invgm(); //实例化 invgm mygam = new invgm(); MWArray ResOut = null; //用于值输出的matlab矩阵 ResOut = mygam.testfunc((MWNumericArray)x, (MWNumericArray)y, (MWNumericArray)p, (MWArray)n); MWNumericArray temp = (MWNumericArray)ResOut; //矩阵转换 mm = temp.ToArray(MWArrayComponent.Real); //c#规范的矩阵 } private void button1_Click(object sender, EventArgs e) { //按textbox1的index找出相应的输出数据 int qq=Convert .ToInt16 ( textBox1.Text); if (qq < 255 && qq>=0) { int pp = Convert.ToInt16(mm.GetValue(0, qq)); textBox2.Text = pp.ToString(); } else { MessageBox.Show("data error"); } } } } 以上是 C#调用 matlab DLL 对一段数据曲线拟和后再作一个反拟和,并输出相应参数的例子。
分享到:
收藏