5

一般に、2 つの 2 次元配列を結合するにはどうすればよいですか?

私の仮定(明らかにこれを簡単にテストできます)は、常に同じ数の列があるということです:

let concatArrays (arr1:obj[,]) (arr2:obj[,]) = 
    ([arr1; arr2]) |> Array2d.concat

ただし、この関数は存在しません。明確にするために、結果は長さ = 長さの合計で、元の arrays2D と同じ列数の 2 次元配列を生成する必要があり、入力と同じ型 (ここでは obj[,]) である必要があります。私は明らかにループ構造でこれを行うことができましたが、f# の方法について疑問に思っていました。ありがとう。

私はこれを試しました:

let append2D (arr1:float[,]) (arr2:float[,]) = 
    let cls = arr1.GetLength 1
    let rows1 = arr1.GetLength 0
    let rows2 = arr2.GetLength 0
    Array2D.init (rows1+rows2) cls (fun i j -> match i with | a when a <= rows1 -> arr1.[i,j] | _ ->  arr2.[i,j])

しかし、これはインデックス範囲外エラーで返されます。

最後の行の更新:

 Array2D.init (rows1+rows2) cls (fun i j -> if i < rows1 then arr1.[i,j] else arr2.[i,j])  

作業ソリューションを更新します。

 Array2D.init (rows1+rows2) cls (fun i j -> if i < rows1 then arr1.[i,j] else arr2.[i-rows1,j])  

皆さんありがとう

4

3 に答える 3

7

この推奨concatに従って、任意の型の2 つの等しい列サイズArray2Dの引数の関数を次に示します'a

let concat (a1: 'a[,]) (a2: 'a[,]) =
    let a1l1,a1l2,a2l1,a2l2 = (Array2D.length1 a1),(Array2D.length2 a1),(Array2D.length1 a2),(Array2D.length2 a2)
    if a1l2 <> a2l2 then failwith "arrays have different column sizes"
    let result = Array2D.zeroCreate (a1l1 + a2l1) a1l2
    Array2D.blit a1 0 0 result 0 0 a1l1 a1l2
    Array2D.blit a2 0 0 result a1l1 0 a2l1 a2l2
    result

これを実験的に確認することもできますが、実装が高度に最適化されているArray2D.initためArray2D.zeroCreate、に基づくバリアントよりもパフォーマンスが何倍も優れています。Array2D.blit

于 2013-10-16T14:39:14.890 に答える