C# 調用 Matlab


Matlab是很豐富的一個資源,我在一個曝光機項目的一個算法中用到了Matlab的函數,在VS的不斷升級過程中以及Matlab的各個版本變化,導致了我經常困惑了,這里還沒有提到操作系統,32位還是64位。

下面我先介紹下我的環境:

windows8.1 64bit, Matlab 7.11.0(R2010b)-64bit,VS2012,vs2008

搭建好環境后,第一步先新建一個M函數, 我這里新建兩個M文件,分別保存為函數名稱multiply.m, makesquare.m文件。

function z = multiply(x,y)
z = x * y;

function y = makesquare(x)
y = magic(x);

 

1.1)新建Deploy tools

  

1.2) 建立工程名字,這里叫做TestCSharpCallMatlab,並選擇生成.NET Assembly,路徑可以更換。

1.3)添加一個類(DemoTest),並為這個類添加兩個m文件。

  

1.4)點擊右邊的設置,選擇要生成的.NET Framework的版本,我這里最高只有.NET3.5,就選擇3.5.

  在其他對話框里面還可以進行一些設置,這里就不介紹了。

1.5)點擊編譯按鈕,就開始編譯了,等待編譯完成。

    

 

1.6)編譯完成后,就生成了2個文件夾,其中distrib里面就有我們想要調用的dll了,具體里面什么內容,我們查看附件就可以了。

    

 

我們生成完動態鏈接庫以后,就要如何調用了,下面我先直接使用VS2008來進行調用(匹配.NET 3.5),

新建一個winform程序,引用兩個庫,一個是MWArray(C:\Program Files\MATLAB\R2010b\toolbox\dotnetbuilder\bin\win64\v2.0),一個是生成的dll(C:\Program Files\MATLAB\R2010b\bin\TestCSharpCallMatlab\distrib\TestCSharpCallMatlab.dll).

然后using設置:

using TestCSharpCallMatlab;
using MathWorks.MATLAB.NET.Arrays;
using MathWorks.MATLAB.NET.Utility;

這里設置兩個按鈕調用2個函數,然后把結果顯示在文本框中,代碼如下:

 1         private void button1_Click(object sender, EventArgs e)
 2         {
 3             try
 4             {
 5                 DemoTest test = new DemoTest();
 6                 int[] offset = {2};
 7                 int[] ppp ={3};
 8                 MWArray a = new MWNumericArray(1,1,offset);
 9                 MWArray b = new MWNumericArray(1,1,ppp);
10                 MWNumericArray results = (MWNumericArray)test.multiply(a, b);
11                 textBox1.Text = string.Format("2 * 3 = {0}", (int)results[1]);
12                 
13             }
14             catch (Exception ex)
15             {
16 
17                 MessageBox.Show(ex.Message);
18             }
19         }
20 
21         private void button2_Click(object sender, EventArgs e)
22         {
23             try
24             {
25                 DemoTest test = new DemoTest();
26                 int[] offset = {3};
27                 MWArray a = new MWNumericArray(1,1,offset);
28                 MWNumericArray results = (MWNumericArray)test.makesquare(a);
29                 StringBuilder sb = new StringBuilder();
30                 sb.AppendLine(string.Format("{0}, {1}, {2}", results[1], results[2], results[3]));
31                 sb.AppendLine(string.Format("{0}, {1}, {2}", results[4], results[5], results[6]));
32                 sb.AppendLine(string.Format("{0}, {1}, {2}", results[7], results[8], results[9]));
33                 textBox2.Text = sb.ToString();
34             }
35             catch (Exception ex)
36             {
37                 MessageBox.Show(ex.Message);
38             }
39 
40         }
View Code

這里要注意的就是類型的轉換,以前我因為轉換問題,出現過too many output arguments的錯誤。
最終顯示結果如下:

 

在這里,VS的設置為any cpu即可。VS2008的Demo代碼鏈接如下:

http://files.cnblogs.com/files/monkeyZhong/TestCSharpCallMatlabApplication2008.zip

 http://files.cnblogs.com/files/monkeyZhong/TestCSharpCallMatlab.zip

但是VS2012就容易出現問題,歸根結底就是要修改VS2012的目標框架為.NET Framework3.5,這樣才會正確,

否則就會出現這樣的錯誤:已停止工作。

當然C#調用Matlab的方法不止這一種,還有幾種其他的方法,這里就不在這里說了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM