MATLAB與C#混合編程

Matlab 數據類型與.NET 數據類型轉換 程序員

by-GalaxyGap 2012-12-11算法

  Matlab 寫算法仍是有不少優點的,具體表如今如下幾個方面:1)Matlab數組

的內部函數是用 C 語言寫的,雖然 M 語言是解釋性語言,但調用內部函數進行瀏覽器

計算仍是很快的。2)通常咱們寫算法都會涉及到不少基本的數學操做,好比說矩函數

陣相乘、矩陣求逆、求特徵值、知足特定分佈的隨機數生成、基本統計量的計算測試

等等。這些基本的數學操做能夠說是咱們算法的基本組成部分,咱們可使用任ui

何一種語言編寫函數一一實現這些基本的數學操做,而後由這些最基本的數學操spa

做構建咱們更復雜的算法。可是咱們有沒有必要這麼作呢?顯然沒有!由於這些設計

基本的數學操做雖然原理咱們都懂,本身親自動手實現也不會太難,但它太耗時,調試

咱們本身寫出來的東西可能也不穩健!耗時這個很好理解了,即便是一個很簡單

的矩陣求逆咱們也要寫一大段的代碼,費勁心思去進行流程設計和步驟分解,編

寫代碼的時候也要當心翼翼地處理各類細節。能夠說從最底層開始寫算法是很是

費神的,等你算法寫好了,估計也已經累得半死,而後項目也早過時了。更嚴重

的是本身寫出來的基本模塊沒有一些數學軟件提供的模塊那麼穩健,可能存在某

些漏洞或 bug,這樣程序調試起來又更費力氣。能夠說從最底層寫算法是一件吃

力不討好的事情。相反若在某些數學軟件的平臺上寫算法,咱們的工做就會省去

一大半,並且寫出來的算法也更穩健。好比說在 Matlab 上咱們要實現矩陣求逆,

只須要調用一個函數即可獲得結果。並且這個函數應該是比較穩健的,不會出什

麼意外。更重要的是,Matlab 平臺不只僅是提供了一些最基本的數學操做,還

在此基礎上實現了一些更高級的模塊,好比說求解線性方程組、曲線擬合、積分

微分等。這些更高級的模塊也均可以成爲咱們算法的組成部分。也便是咱們的算

法能夠在更粗的粒度上來構建,而不侷限於從基本的數學操做上開始構建。3)

Matlab 支持將 M 文件編譯成其餘平臺可以使用的組件或者說模塊,也便是

Matlab 可以和其餘平臺通訊,只須要安裝一個 200 多兆的 MCR 便可。

  固然什麼東西都不是十全十美的,用 Matlab 寫算法也有它的缺點,特別是

當咱們想把 Matlab 中寫的算法應用到其餘平臺上時,它的缺點就體現得更明顯。

1)首先是速度的問題,也許咱們的算法直接在 Matlab 平臺上運行的時候速度是

很快的,但應用到其餘平臺上的時候就很慢了,這是由於 Matlab 和其餘平臺通

信的時候耗時比較多,尤爲是和.NET 通訊的時候。2)其次 Matlab 和其餘平臺通

信的時候涉及到數據轉換,由於不一樣平臺的數據類型通常不相同。這種數據類型

的轉換有時候比較複雜,不便於不一樣平臺下的程序員交流。好比說一個熟悉

Matlab 平臺的算法程序員把算法寫好並編譯成.NET 程序集以後交給一個不熟悉Matlab 環境的.NET 程序員去用這個算法。在這種狀況下,也許 Matlab 程序員很

清楚他的算法須要什麼樣的數據做爲輸入,而後輸出了什麼樣的數據,但.NET

程序員卻未必對這一算法的輸入輸出瞭解得那麼清楚了。沒有搞清楚輸入輸出想

要應用這一算法就有點勉爲其難。所以 Matlab .NET 之間的數據交換就顯得尤

爲重要,只有能理解兩個平臺的數據類型以及他們之間的轉換過程才能順利地將

兩個平臺結合在一塊兒。本文如下就專門討論 Matlab 平臺與.NET 平臺的數據交換

過程。開始以前先提醒一下:Matlab 平臺與.NET 平臺的數據交換全是由

MathWorks.MATLAB.NET.Arrays 這一命名空間下的類和接口實現的。這是一個由

Matlab 爲支持.NET 平臺開發的.NET 中的方法集。所以咱們要想搞清楚這兩個平

臺之間是如何通訊的,除了對兩個平臺的數據類型由足夠的瞭解以外,還要深諳

這個命名空間下的各類方法的做用。

Matlab 中的 M 文件編譯成.NET 可用的程序集

  咱們首先從 Matlab 這邊開始,看看在 Matlab 這邊寫好的函數是怎樣一步步

變成.NET 中可用的函數。假設咱們在 Matlab 中寫好了這樣一個簡單函數:

function y = Sum(x)

y = sum(x);

  關於 sum 這個 Matlab 內部函數的做用,你們能夠在 Matlab help 中查到,

這裏就不具體說了。只須要看看在 Matlab 中它的輸入輸出便可。好比說輸入這

樣一個矩陣(咱們知道 Matlab 中全部的數據類型都是以矩陣的形式表示的,即

使是一個單一值,Matlab 中也把它表示成 1×1 的矩陣):

data = [1 2 3;4 5 6; 7 8 9; 10 11 12];

data =

          1          2          3

          4          5          6

          7          8          9

        10        11        12

能夠看到這是一個 4×3 的矩陣。調用 Sum 函數以後獲得的結果爲:

y = Sum(data)

y =

        22        26        30

這個時候 y 已是一個 1×3 的矩陣了。咱們再用 Sum 處理一下這個 y 獲得的結

果是:

Sum(y) ans =

        78

能夠看到就這麼一個簡單的函數在 Matlab 中它的輸入輸出但是變化多多。它可

以接受一個多行多列的矩陣,而後針對每一列求和(第一次調用 Sum)獲得一個

一行多列的矩陣;也能夠接受一個一行 n 列的矩陣,而後針對該行求和獲得一個

一行一列的矩陣。這對於看慣了固定輸入類型的.NET 程序員來講看着確實彆扭,

起碼我是這樣的。固然這實際上一種重載了,.NET 中也能實現,只是在.NET

每個重載函數咱們都會顯式地寫出來,用的時候也會有提示,而 Matlab 中卻

是一個函數搞定。大有一種:參數你隨便傳,我看狀況處理,但我是怎麼處理的

不明顯告訴你,我把它放在心裏裏。說白了,它的重載函數都隱藏起來了。

  好,如今咱們把這個函數編譯成.NET 中能調用的程序集。編譯的過程以下:

1 Matlab Command  Window 中運行 deploytool 命令調出編譯和打包界面,

將工程名字改爲 SumComp,類型選擇.NET Assembly

2 Build 標籤下單擊 Class 選項中的 Add  Class,把 Class1 改爲 SumClass,單擊

Add File 把前面寫好的 M 文件 Sum.m 添加到該類下。

3 找到 Settings(Matlab  2012b 版本的能夠單擊右上角那個齒輪,在彈出的菜單中

選擇 Settings),打開 Project  Settings 對話框,並在.NET 標籤下選擇 Microsoft

Framework 4.0(這一步因人而異了,看你接下來用哪一版本的 VS 平臺作測試,

個人是 VS2010,對應的.NET Framework 4.0,其餘的只要選擇對應的 Framework

就好了。這一步是爲了將 Matlab 編譯生成的程序集的.NET  Framework 版本與你

測試程序的.NET Framework 版本對應起來,不對應的話是生成的程序集在引用的

時候會出錯的。)

4 點擊編譯,生成.NET 能夠引用的程序集。這一步完成以後該工程會在工程文件

夾下生成兩個子文件夾 distrib src,打開 distrib 文件夾能夠看到四個文件,這

就是生成的程序集。能夠查看那個 readme.txt 文件以瞭解每一個文件的做用,咱們

接下來在測試程序中須要引用的就是那個 SumComp.dll

到這裏Matlab中的函數就轉化成了.NET中能夠引用的程序集了。Matlab中的Sum

函數就包含在了 Sumcomp.dll 及其相關的文件裏。這以程序集包含了一個

SumClass 類,類內包含着一個叫 Sum 的函數,命名空間是 SumComp。接下來就

能夠在.NET 的測試程序中使用這個函數了。

.NET 中測試 Matlab 數據類型與.NET 數據類型的交換

1 首先在 VS 中新建一個控制檯應用程序,添加 MWArray 組件引用(這一組件如

果順利地被你的 VS 識別了的話,在你添加引用的時候會存在於.NET 標籤下,你直 C:\Program

Files\MATLAB\R2012b\toolbox\dotnetbuilder\bin\win32\v2.0\MWArray.dll,將該 dll

添加到引用便可)。這一組件便是前面說的 Matlab 爲支持.NET 而開發的一套數據

交換接口。

2 其次還要添加剛剛生成的組件引用,也即定位到 distrib 文件夾下添加對

SumComp.dll 的引用,或者你把這個文件下的全部文件拷貝到當前工程的目錄下,

再對 SumComp.dll 添加引用。

3 接下來使用命名空間,在測試程序的 using 區域內添加如下兩個 using

using SumComp;

using MathWorks.MATLAB.NET.Arrays;

  好,以上  這些步驟都完成以後能夠開始測試 Matlab .NET 之間的數據交換

了。

  不過在測試以前先別忙,咱們先來看看 Matlab 編譯生成的組件 SumComp.dll

幫咱們把 Matlab 中的數據轉換到了哪一步。SumComp.dll 這個組件是 Matlab

最後產物,後面的事情就交給.NET 了,因此頗有必要先研究下這個 SumComp.dll

所包含的方法究竟是個什麼樣的形式,其輸入輸出參數都是些什麼。雙擊引用中

SumComp 能夠打開對象瀏覽器,咱們能夠一級級定位到最後 SumClass 包含的

函數,在這裏咱們能夠看到編譯以後的 Sum 函數的廬山真面目,這裏 Matlab

共生成了 5 Sum 的重載函數!從一個 M 文件中的 Sum 函數變成 5 .NET 裏的

Sum 的重載函數,是否是有點出乎意料!這五個重載函數分列以下:

public void Sum(int

numArgsOut

, ref MathWorks.MATLAB.NET.Arrays.MWArray[]

argsOut

,

MathWorks.MATLAB.NET.Arrays.MWArray[]

argsIn

)

    SumComp.SumClass 的成員

public MathWorks.MATLAB.NET.Arrays.MWArray[] Sum(int

numArgsOut

,

MathWorks.MATLAB.NET.Arrays.MWArray x)

    SumComp.SumClass 的成員

public MathWorks.MATLAB.NET.Arrays.MWArray[] Sum(int

numArgsOut

)

    SumComp.SumClass 的成員

public MathWorks.MATLAB.NET.Arrays.MWArray

Sum(MathWorks.MATLAB.NET.Arrays.MWArray x)

    SumComp.SumClass 的成員

public MathWorks.MATLAB.NET.Arrays.MWArray Sum()

    SumComp.SumClass 的成員

  看到了吧,幾乎大部分參數都是 WMArray 類型的,也即 WMArray 這種數據

類型是 Matlab 數據類型和.NET 數據類型相互轉換的中間數據類型!並且 Matlab

並非一對一地把一個函數編譯成了另外一個相同形式的函數,而是編譯成了多個

重載函數以供用戶以不一樣的調用方式調用。但咱們如今有一個疑問就是:是否針對每種特定的輸入,每一個重載函數均可以調用,而且能實現一樣的結果。後一點

很是重要,由於相同的輸入,調用一樣功能的函數,必需要獲得相同的輸出。

  首先咱們來看看是否是針對各類各樣的輸入,每一個函數均可以調用。回答顯

然是否認的。由於咱們能夠看到第五個重載函數沒有輸入參數,只有輸出參數,

顯然在咱們想輸入數據的時候,是不可以經過調用第五個函數來實現的。第五個

函數看起來並無任何做用,咱們不清楚它到底從哪裏引用數據,而後輸出結果。

接下來咱們就來一一測試剩下的 4 個重載函數。在 Main 函數中編寫如下代碼:

            double[,] data = {{1,2,3},{4,5,6},{7,8,9},{10,11,12}};

            MWNumericArray dataArray = new MWNumericArray(data);

            MWNumericArray resultArray;

            SumClass mySum = new SumClass ();

            resultArray = (MWNumericArray)mySum.Sum(dataArray);

            double[,] result =(double[,]) resultArray.ToArray();

            for(int i = 0; i<result.GetLength (0);i++)

                for (int j = 0; j < result.GetLength(1); j++)

                {

                    Console.WriteLine("result[{0},{1}] = {2}", i, j, result[i, j]);

                }

            Console.WriteLine("Press enter to finish");

            Console.ReadLine();

  咱們一步步調試這段代碼。首先定義並初始化一個.NET 中的二維數組 data

該二維數組的維度是 4×3,這個數組將做爲咱們求和函數的輸入。而後咱們要

把這個.NET 中的二維數組轉化成 MWArray 的中間類型,由於 Matlab 生成的函數

接收的是 MWArray 類型的數據,MWArray Matlab .NET 進行數據交換的中間

類型。這裏咱們定義的是 MWNumericArray 類型,它是從 MWArray 派生的類型,

在傳遞參數的時候一樣可用。以後很關鍵的一個問題就是如何把 double[,]轉換成

MWNumericArray 了,這裏很是簡單,只須要在實例化 MWNumericArray 的時候

data 做爲 MWNumericArray 構造函數的參數就好了。這一個類的構造函數非

常強大,有 54 個重載構造函數,幾乎能夠把你在.NET 中的任何數值型數據類型

轉成在 Matlab 中與該數據類型結構類似的數據類型。好比說這裏傳遞的是一個

4×3 的二維數組,通過這樣一個轉化以後,至關於 dataArray 也表明了一個 Matlab

中的 4×3 的數組。而後再定義一個 MWNumericArray 類型的 resultArray 變量來

接收結果。接下來實例化 SumClass 並調用 Sum 函數。須要注意的是這裏調用的

Sum 函數是和咱們在 Matlab 中寫的 Sum 函數形式最相近的那個,也便是一個輸

入參數一個輸出參數,輸入參數包含輸入數據,輸出參數包含結果數據。這個函

數就是上面所列函數的第四個。另外函數調用以後返回的結果是 MWArray 類型的,

MWNumericArray 來接收它。MWArray MWNumericArray 的基類,從 MWArray

MWNumericArray 的轉換是向下 cast(仍是向上?搞不清楚了,反正從基類到派

生類的 cast 須要顯式轉換,反之能夠進行隱式轉換),因此要進行顯式轉換。獲

Sum 函數的結果後,還要倒過來把中間類型的結果轉換到.NET 平臺上的結果,

也便是把 MWNumericArray 類型的結果轉成 double[,]的結果。這一步也很簡單,

直接調用 MWNumericArray ToArray 方法。這個方法有兩個重載,第一個不用

輸入任何參數;第二個須要指定是輸出 MWNumericArray 所含數據的實部仍是虛

部。由於咱們的輸入數據不是複數,因此只需調用第一個重載就夠了。最後打印

出結果:

result[0,0] = 22

result[0,1] = 26

result[0,2] = 30

Press enter to finish

能夠看到最後的輸出結果和 Matlab 中的輸出結果是一致的,都是一個 1×3 的矩

陣。

  以上是對整一個數據轉換流程的說明,Matlab .NET 的數據交換基本上都是

按照這個流程在走的,只是中間還有一些細節的東西須要交代。

1 輸入數據的維度問題

1)若輸入一維數組

            //輸一維數組,調用標準Sum函數

            double[] data = new double[]{1,2,3,4,5,6,7,8,9,10};

            MWNumericArray dataArray = new MWNumericArray(data);

            MWNumericArray resultArray;

            SumClass mySum = new SumClass();

            resultArray = (MWNumericArray)mySum.Sum(dataArray);

            double[,] result = (double[,])resultArray.ToArray();

            for (int i = 0; i < result.GetLength(0); i++)

                for (int j = 0; j < result.GetLength(1); j++)

                {

                    Console.WriteLine("result[{0},{1}] = {2}", i, j, result[i, j]);

                }

            Console.WriteLine("Press enter to finish");

            Console.ReadLine();

此時 dataArray 1×10 的數據,見圖 1,也即.NET 中的一維數組被轉換成了

Matlab 中的行向量。咱們知道在 Matlab 中對行向量使用 sum 函數最後會獲得一

個值,到這個值在 Matlab 中其實是一個 1×1 的矩陣,因此咱們能夠預計結果變量 resultArray 也應該是 1×1 的矩陣,事實也確實如此,見圖 2

 

一維數組被轉換成 MWNumericArray 以後的維度

 

一維數組做爲輸入產生的結果數據的維度

最後的輸出結果以下:

result[0,0] = 55

Press enter to finish

2)若輸入高維數組

.NET 平臺上咱們對高維數組的使用比較少,但在 Matlab 中使用得仍是比較頻

繁的,因此這裏給出一個.NET 中的三維數組如何傳遞給 Matlab 的例子:

            ///輸入三維數組,調用標準Sum函數

            double[,,] data = new double[,,]{{{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}} };

            MWNumericArray dataArray = new MWNumericArray(data);

            MWNumericArray resultArray;

            SumClass mySum = new SumClass();

            resultArray = (MWNumericArray)mySum.Sum(dataArray);             double[,,] result = (double[,,])resultArray.ToArray();

            for (int i = 0; i < result.GetLength(0); i++)

                for (int j = 0; j < result.GetLength(1); j++)

                    for (int k = 0; k < result.GetLength(2);k++ )

                    {

                        Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,

j, k]);

                    }

            Console.WriteLine("Press enter to finish");

            Console.ReadLine();

三維數組 data 初始化以後在.NET 中的表示是這樣的,見圖 3

 

  3  三維數組 data[2,2,3].NET 中的表示形式

.NET 中,二維的狀況下,我通常認爲行表明第二維,列表明第一維,也即行

是高維,列是低維,固然你也能夠把它反過來。但要記住的是 GetLength(0)方法

返回的是行數,GetLength(1)返回的是列數,二行三列的數組表示形式是這樣的

data[2,3]。在三維的狀況下,仍然將最低維(第一維)認爲是列所在的維,第二

維是行所在的維,再往上纔是第三維。因此三個維度從高往低分別爲 2,2,3 的高

維數組在.NET 中的表示形式是 data[2,2,3]。這個時候 GetLength(0)得到的是第三

維的維度,GetLength(1)得到的是第二維的,而 GetLength(2)得到的纔是第一維的。

三維數組能夠當作是多個一樣結構的二維數組拼在一塊兒。更高維的數組以此類推。

Matlab 中高維數組的表示和.NET 中不一樣。將.NET 中的 data[2,2,3]轉換成

MWNumericArray 類型的 dataArray 後,其表示形式如圖 4 所示。Length(0)得到的

是行數,length(1)得到的是列數,length(2)得到的纔是第三維的維度。 

4 data[2,2,3]轉換成 MWNumericArray 類型後的變量 dataArray

調用 Sum 函數返回的結果 resultArray,見圖 5。能夠看到 Matlab 中的 sum 函數

是沿着列維做用的,也便是將每一列值加起來。最後仍然返回一個三維矩陣,只

不過維度已經變成 1,3,2 了(Matlab 中的表示形式,第一維的維度是 1,第二維

3,第三維 2,能夠理解爲 2 個一行三列矩陣的拼接)。

 

求和以後返回的 MWNumericArray 類型的結果變量 resultArray

最後將 MWNumericArray 類型表示的三維矩陣轉換成.NET 中的三維數組,如圖 6

所示。輸出結果以下:

result[0,0,0] = 5

result[0,0,1] = 7

result[0,0,2] = 9

result[1,0,0] = 17

result[1,0,1] = 19

result[1,0,2] = 21 Press enter to finish

 

求和並轉換以後的結果數組 result

2 其餘 Sum 重載函數的測試

1)調用第一個重載函數

第一個重載函數原型:

public void Sum(int

numArgsOut

, ref MathWorks.MATLAB.NET.Arrays.MWArray[]

argsOut

,

MathWorks.MATLAB.NET.Arrays.MWArray[]

argsIn

            //輸入三維數組,調用第一個重載函數

            double[, ,] data = new double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 },

{ 10, 11, 12 } } };

            MWArray[] argin = new MWNumericArray[1];

            argin[0] = new MWNumericArray (data);

            MWArray[] argout = new MWNumericArray[1];

            

            SumClass mySum = new SumClass();

            mySum.Sum(1, ref argout,argin);

            double[, ,] result = (double[, ,])argout[0].ToArray();

            for (int i = 0; i < result.GetLength(0); i++)

                for (int j = 0; j < result.GetLength(1); j++)

                    for (int k = 0; k < result.GetLength(2); k++)

                    {

                        Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,

j, k]);

                    }

            Console.WriteLine("Press enter to finish");

            Console.ReadLine();

這種調用方式是以引用傳參的方式調用的,三個輸入參數的類型分別是 int,

MWArray[], MWArray[].第一個參數表示輸出參數的個數,第二個參數是引用參數,用來保存輸出值的,最後一個參數傳入待處理的數據。注意到後兩個參數是

MWArray 類型的數據,是否能夠將多個待求和的數組一次性傳入最後獲得一個

同維的 MWArray 類型的結果數組呢?我試了一下,發現這樣作行不通,代碼示

例以下,有興趣的朋友能夠本身試一下:

                    //輸入三維數組,調用第一個重載函數

            double[, ,] data = new double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 },

{ 10, 11, 12 } } };

            MWArray[] argin = new MWNumericArray[2];

            argin[0] = new MWNumericArray (data);

 

            double[,] data2 = new double[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10,

11, 12 } };

            argin[1] = new MWNumericArray(data2);

 

            MWArray[] argout = new MWNumericArray[2];

                    

            SumClass mySum = new SumClass();

            mySum.Sum(2, ref argout,argin);

            double[, ,] result = (double[, ,])argout[0].ToArray();

            for (int i = 0; i < result.GetLength(0); i++)

                for (int j = 0; j < result.GetLength(1); j++)

                    for (int k = 0; k < result.GetLength(2); k++)

                    {

                        Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,

j, k]);

                    }

 

            double[,] result2 = (double[,])argout[1].ToArray();

            for (int i = 0; i < result2.GetLength(0); i++)

                for (int j = 0; j < result2.GetLength(1); j++)

                {

                    Console.WriteLine("result2[{0},{1}] = {3}", i, j, result2[i, j]);

                }

            Console.WriteLine("Press enter to finish");

            Console.ReadLine();

這段代碼調了好久都沒調成功,試着把 argin[0] argin[1]改爲同結構的數組,行

不通;試着把 Sum 函數的第一個參數改爲 1,也行不通。都是在調用 Sum 函數

的時候出現」Too many input parameters」的錯誤。不知道增長這個輸出參數個數到

底是什麼意思,放在這裏有什麼用。暫且放在這吧。

2)調用第二個函數

第二個重載函數原型: public  MathWorks.MATLAB.NET.Arrays.MWArray[]  Sum(int

numArgsOut

,

MathWorks.MATLAB.NET.Arrays.MWArray x) 

這一個重載函數實際上是第一個和第四個的綜合。將輸出參數放在了外面,同時又

在輸入參數中加了一個輸出參數個數 numArgsOut。測試代碼和第一個重載函數

的測試代碼相似:

            //輸入三維數組,調用第二個重載函數

            double[, ,] data = new double[,,] { { { 1, 2, 3 }, { 4, 5, 6 } }, { { 7, 8, 9 },

{ 10, 11, 12 } } };

            MWNumericArray  argin = new MWNumericArray(data);

 

            MWArray[] argout = new MWNumericArray[1];

 

            SumClass mySum = new SumClass();

            argout = mySum.Sum(1, argin);

            double[, ,] result = (double[, ,])argout[0].ToArray();

            for (int i = 0; i < result.GetLength(0); i++)

                for (int j = 0; j < result.GetLength(1); j++)

                    for (int k = 0; k < result.GetLength(2); k++)

                    {

                        Console.WriteLine("result[{0},{1},{2}] = {3}", i, j, k, result[i,

j, k]);

                    }

            Console.WriteLine("Press enter to finish");

            Console.ReadLine();

第三個重載函數和第五個重載函數同樣,無解,不知道從哪裏輸入數據。

3 其餘注意事項

  有關 MWNumericArray 數據類型以及其餘由 MWArray 派生的其餘數據類型

.NET 平臺數據類型的轉換你們還能夠去查看這些類提供的一些方法。好比說

MWNumericArray ToVector 方法還能夠將 Matlab 中的矩陣轉成.NET 中的一維

數組,NumberofDimensions 得到維度數,NumberofElements 得到元素個數等等。

總結

  關於 Matlab .NET 數據類型轉換,首先要求咱們對兩邊的數據類型都有清

楚的瞭解。MWArray 及其派生類能夠表明 Matlab 中各類各樣的數據類型,好比

說一個 MWNumericArray 類型的變量能夠表示一個數值(1×1)、一個一維數組

1×n)、一個多維數組(m×n m×n×p……等)。這樣向.NET 中的數據類型

轉換時最保險的方法就是在.NET 平臺上定義一個和 MWArray 類所包含的潛在數

據類型結構相同的變量。這樣轉換通常纔不會出問題。   Matlab M 文件編譯成.NET 中可調用的組件以後,最好再將這些組件

.NET 平臺上再封裝一層,將中間類型的參數所有變成.NET 的數據類型參數,

以供不熟悉 Matlab .NET 數據交換的.NET 程序員使用。

在這麼多重載函數中,最好使用和 M 文件中定義的函數形式相同的那個函

數(我習慣把它叫作標準函數),其餘重載函數儘可能少用或不用,以避免沒搞清楚

這些函數的輸入輸出形成函數調用失敗或獲得錯誤結果。

相關文章
相關標籤/搜索