首页 > 程序开发 > 软件开发 > C# >

C# 实现调用Matlab函数(Visual Studio:2008, Matlab:R2009a)

2014-01-22

最近正在给客户做的个人项目,要求实现C 与Matlab之间的调用,即C winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上。  网上此类的文章较多,但自己

最近正在给客户做的个人项目,要求实现C#与Matlab之间的调用,即C# winform界面收集用户输入的参数,将参数传递给Matlab的算法计算,Matlab函数返回的结果显示在winform界面上。
  网上此类的文章较多,但自己在实现过程中还是有些差别,所以在项目进行之前,自己写了一个测试的例子来实现C#对Matlab函数的调用。
一. 测试用例简介
  功能:Matlab函数计算两个数值a与b的和,a与b的值由C#提供,和值c经Matlab计算得出后,返回给C#
  环境:Microsoft Visual Studio 2008
     Matlab R2009a(Version 7.8.0.347)
  备注:由官网可知,Matlab对类似其他程序调用都提供了很好的支持,这里没有选择VS版本大于Matlab版本,是因为担心Matlab版本只支持自己之前的VS版本。
二. 实现步骤
  1. 实现Matlab函数
    A. 打开Matlab R2009a,新建testAdd.m文件
    B. testAdd.m中实现加法函数
1 function y = testAdd(a, b)
2 y = a + b;
  2. 编译testAdd.m,得到DLL文件,以便由C#引用
    A. 在Matlab命令行中输入"deploytool",即可弹出"Deployment Tool"工具窗口
     在网上看很多资料,执行"deploytool"命令之前都需要安装Matlab编译器(命令:"mbuild -setup"),但我不这样做,也可编译。怀疑是否与我将VS,Matlab都装在一台机器有关。另外即便我执行这安装命令,也找不到正确的编译器。总之,我并没有按照网上教程,直接"deploytool"即可。这也提醒自己:实践过后,才知是否正确,不要盲目听从别人方法。
    B. 编译DLL,需要在"Deployment Tool"工具窗口中新建Deployment project
     这里我建了名为"test"的工程,选择project类型时,应选择.NET Component,因为这里我需要其作为C#的引用。同时注意这里的工程名,即是你编译出DLL的名称,同时C#程序调用时,"Test"即为封装Matlab函数的类名。他将你的工程名,首字母大写用为高级语言中的类名。
    C. 配置"test" project
     首先将testAdd.m添加到test工程下Test文件夹中(右击Test,选择Add File)。
     其次选择Setting,在设置中,配置.NET Microsoft Framework,由"Default"改为"2.0",不能用默认。网上说法是否则编译出的DLL会有问题。
     注意:这里网上许多资料讲,要将Assembly Type设置为Shared,但我发现如果这样,必须要提供Encryption Key的文件路径,这个就没法提供了。所以我并没有这样做,事实上没有影响。疑惑的地方。
    D. 点击"Build"编译文件(如下图所示)
    
     即可在test\src路径下得到编译后的DLL文件
     
  3. 实现C#程序,调用Matlab编译出的DLL
    A. C#项目中,导入Matlab DLL引用
     导入的文件:test.dll, testNative.dll, MWArray.dll(%matlabpath%\toolbox\dotnetbuilder\bin\win32\v2.0,MWArray是用于C#与Matlab之间的数据交换类,传值,取结果都用到它)
    B. 实现C#调用代码
复制代码
1 using System.Data;
2 using System.Drawing;
3 using System.Linq;
4 using System.Text;
5 using System.Windows.Forms;
6 using MathWorks.MATLAB.NET.Utility;
7 using MathWorks.MATLAB.NET.Arrays;
8 using test;
9
10 namespace testMatlab
11 {
12 public partial class Form1 : Form
13 {
14 public Form1()
15 {
16 InitializeComponent();
17
18 label6.Text = "";
19 }
20
21 private void button1_Click(object sender, EventArgs e)
22 {
23 //Get input number from UI
24 int iTextBox1 = int.Parse(textBox1.Text.ToString());
25 int iTextBox2 = int.Parse(textBox2.Text.ToString());
26
27 MWArray result = null;
28 MWNumericArray a = new MWNumericArray(iTextBox1);
29 MWNumericArray b = new MWNumericArray(iTextBox2);
30
31
32 //call function testAdd, provided by Matlab
33 Test t = new Test();
34 result = t.testAdd((MWArray)a, (MWArray)b);
35
36
37 int y = ((MWNumericArray)result).ToScalarInteger();
38
39 //show result in UI
40
41 textBox3.Text = y + "";
42 label6.Text = "Get the result by Matlab DLL, Answer: " + y;
43 }
44 }
45 }
相关文章
最新文章
热点推荐