2013-10-08 49 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

相关问题