2013-10-08 48 views
0

我之前在c#here中提出過這個問題,並且沒有真正做到這一點的簡潔方法。我現在正在嘗試在fsharp中做同樣的事情,看看結果如何。在f#中將相同長度的數組組合到一個2d數組中#

我有兩個相同長度和類型的數組,我想將它們組合成一個具有相同長度和2列的數組。我有這樣的代碼,這是否:

let twoDimensionalArray (arr1:array<'a>) (arr2:array<'a>) = 
    let rws = arr1|> Array.length 
    Array2D.init rws 1 (fun i j -> arr1.[i], arr2.[i]) 

說實話這讓我驚訝了一下,因爲我本來以爲應該在列維度這樣是2:

Array2D.init rws 2 (fun i j -> arr1.[i], arr2.[i]) 

但如果我更改爲2,然後我得到這個:

val it : (float * float) [,] = [[(1.0, 3.0); (1.0, 3.0)] 
          [(2.0, 4.0); (2.0, 4.0)]] 

此數據:

let arr1 = [| 1.0; 2.0 |] 
let arr2= [|3.0; 4.0 |] 

爲什麼?

另外,我真的很想寫這更generacally,所以如果第一個數組有2列和第二個1,我得到一個3列矩陣等等。我試過這個:

let MultiArray (arr1:array<'a>) (arr2:array<'a>) = 
    let rws = arr1.Length 
    let c1 = arr1.GetLength(1) 
    let c2 = arr2.GetLength(1) 
    let cols = c1+c2 
    Array2D.init rws cols (fun i j -> arr1.[i], arr2.[i]) 

但這是有缺陷的。

您能否讓我知道我該怎麼做?此外,爲什麼我的第一個功能可行,但我認爲是錯誤的

謝謝

謝謝約翰!工作液:

let MultiArray (inp:float[][]) = 
    let cls = inp |> Array.length 
    let rows = inp.[0] |> Array.length 
    Array2D.init rows cls (fun i j -> inp.[j].[i]) 

樣本數據和使用:

let arr1 = [|1.0 ; 4.0; 6.0;5.;8.|] 
let arr2= [|7.0; 8.0; 9.0;9.;10. |] 
let inp = [| arr1; arr2; arr1|] 

MultiArray inp;; 
val it : float [,] = [[1.0; 7.0; 1.0] 
        [4.0; 8.0; 4.0] 
        [6.0; 9.0; 6.0] 
        [5.0; 9.0; 5.0] 
        [8.0; 10.0; 8.0]] 

回答

3

所以對於第一個代碼的意外版本的原因是要創建一個元組的二維數組 - 而不是值的二維數組。在這種情況下,實際上應該將第一維的大小設置爲1,因爲第二維隱藏在元組具有更多變量的事實中。

它創建一個實際的二維數組一個簡單的版本將是

Array2D.init rws 2 (fun i j ->match j with |0 -> arr1.[i] |1 -> arr2.[i]) 

更寬泛的版本將採取數組作爲輸入的數組像這樣

let MultiArray (inp:float[][]) 
    let count = inp |> Array.length 
    let rows = inp.[0] |> Array.length 
    Array2D.init count rows (fun i j -> inp.[j].[i] 
+0

感謝約翰,我明白你的第一個點。但關於第二,我試圖創建2個不同的矩陣/矩陣,所以如何從arr1和arr2創建inp:float [] []? – nik

+0

@nik - '[| arr1; arr2 |]' –

+0

尷尬簡單... :) – nik

相關問題