2010-03-02 52 views

回答

6

array2D function會變成任何seq<#seq<'T>>成一個'T [,]所以它應該工作車削一堆一維數組爲二維數組。

let arr1 = [| 1; 2; 3 |] 
let arr2 = [| 4; 5; 6 |] 

let combined = array2D [| arr1; arr2 |] 
0

我不認爲有任何內置來處理這個問題。不過,您可以根據Array2D.initArray2D.blit來定義自己的可重用方法。如果您需要將多個列合併爲一個邏輯整體,我認爲使用數組而不是二維數組通常會更方便(並且通常,.NET中的1D數組操作要比多維數組快得多,二維陣列操作)。

+0

感謝。這是非常有幫助的。我還以爲數組的數組是一樣的array2D在F#中。 – ahala 2010-03-03 02:19:51

3

據我所看到的,有沒有F#庫函數會變成幾個一維數組到一個單一的二維數組,但可以使用Array2D.init編寫自己的功能:

let joinInto2D (arrays:_[][]) = 
    Array2D.init arrays.Length (arrays.[0].Length) (fun i j -> 
    arrays.[i].[j]) 

它帶有一個數組所以當你調用它時,你會給它一個包含你想要加入的所有數組的數組(例如[| arr1; arr2 |]來加入兩個數組)。該函數將多個一維數組連接成一個單一的二維數組,每個輸入數組包含一行。它假定所有給定數組的長度是相同的(最好添加一個檢查來驗證,例如使用Array.forall)。 init函數創建一個指定尺寸的數組,然後調用我們的lambda函數爲每個元素計算一個值 - 在lambda函數中,我們使用該行作爲數組數組中的索引,並將該列作爲個人的索引陣列。

這裏是展示如何使用該功能的例子:

> let arr1 = [| 1; 2; 3 |] 
    let arr2 = [| 4; 5; 6 |];; 

> joinInto2D [| arr1; arr2 |];; 
val it : int [,] = [[1; 2; 3] 
        [4; 5; 6]] 

編輯:已經有一個函數來做到這一點 - 真好!如果你想加入一維數組作爲列而不是行(,這是array2D實施的行爲,我會離開這裏的答案,因爲它可能仍然是有用的,例如,

+0

感謝湯姆,是我一直想要以列的形式連接數組。 – ahala 2010-03-03 02:12:14