2011-11-17 95 views
1

我有一個將多維數組從Matlab應用程序服務器傳輸到F#腳本會話的問題。將數組從Matlab應用程序服務器傳輸到F#

#I @"C:\Program Files\MATLAB\R2010a\bin\win64";; 
#r @"MLApp.dll";; 
let matlab=new MLApp.MLAppClass();; 
matlab.Execute("a=[1 2 3 4 5;6 7 8 9 10]");; 
let b =matlab.GetVariable("a","base");; 
let arr = b :?> float[] 

應用downcast後,數組的類型爲array2D,float [,]。但會顯示這樣的數組:

arr;; 
val it : float [,] = [[1.0; 2.0; 3.0] 
         [4.0; 5.0; 6.0]] 

對於矩形陣列,我習慣了得到這樣的

arr;; 
        = [|[|1.0; 2.0; 3.0|] 
         [|4.0; 5.0; 6.0|]|] 

哪裏是這些類型之間的區別?爲什麼我不能將數組切片應用於float [,]類型的arr?

回答

2

float[,]表示二維數組。您可以使用Array2D模塊中的函數使用它,並且可以通過指定兩個索引(例如arr.[0, 0])來訪問元素。該數組必須是規則的(矩形),所以您也可以使用切片,因爲矩形中的所有值都已定義。

> let arr2d = array2D [ [1 .. 3]; [4 .. 6] ];; 
val arr2d : int [,] = [[1; 2; 3] 
         [4; 5; 6]] 

> arr2d.[1,1];; 
val it : int = 5 

類型float[][]你在第二種情況下得到的是含有1 float維數組一維數組。要訪問一個元素,首先需要返回的數組中,以指定所述第一陣列的索引,然後選擇一個元素:

> let arrOfArr = [| [| 1 .. 3 |]; [| 0 |] |];; 
val arrOfArr : int [] [] = [|[|1; 2; 3|]; [|0|]|] 

> arrOfArr.[0].[1];; 
val it : int = 2 

如本例所示,類型float[][]不必代表矩形陣列,因爲各個陣列可能具有不同的長度(即在上述示例中爲3和1)。這是您無法使用切片訪問其元素的原因。

如果您有float[][]類型的數組,則可以使用array2D函數將其轉換爲float[,]。如果數組不是矩形,則該函數將失敗。

+0

托馬斯,多麼榮幸!如果我理解正確,數組類型的數組也被稱爲「鋸齒數組」?關於分割,如果我嘗試做類似'arr。[0,0..2]'的操作,我會收到錯誤消息:'此表達式預計有 'a [] ,但這裏的類型爲 float [,]' – user1047427

+0

是的,這是正確的。數組的數組也被稱爲「鋸齒狀數組」。關於切片,您總是需要爲兩個索引指定切片(並且結果將是二維數組,即使您實際只選擇其中一個維中的一個元素)。例如:'arr。[0..0,0..2]' –

相關問題