2016-10-26 16 views
2

2次元配列を1次元配列に平面化するには、どのように各行を上記の配列に追加しますか?f#2次元配列を1次元配列に平坦化する

私の問題は、これを行うためにマップを使用する方法を理解していないため、これを行うためにフラットマップ/(類似の名前をここに挿入)関数があります。

let colors = Array2D.init 800 480 (fun i j -> 
    if i % 3 = 0 || j % 3 = 0 then Color.Black 
    else Color.Red) 
let data = colors |> map (fun c -> c) 

マップの戻り値の型が1d配列に変更されるようにマップを使用する方法はありますか?

+2

[Array2D to Array]の可能な複製(http://stackoverflow.com/questions/12870368/array2d-to-array) –

答えて

2

あなただけが配列にキャストすることができ、それを平らにしたい場合:

colors |> Seq.cast<Color> 
     |> Seq.length //val it : int = 384000 

方が便利だがArray2Dが本当に.NETコレクションであるArray2Dで何かがあるかもしれません。不揃いの配列やリストを扱うと、Seq.concatまたはcollectにアクセスできます。

Add1を

ここでは、1Dリストに既にある:

let colors = [for i in 0..799 do 
       for j in 0..479 -> 
       if (i % 3 = 0) || (j % 3 = 0) then Color.Black 
       else Color.Red] 

アクティブパターンで

実際の複雑さに応じて、これもactive patternsの良い候補であるかもしれません。パターンマッチングとともに、BlackとRedのアクティブなレコグナイザが定義され、次に、concatに供給され、最後に元のArray2Dに対してチェックされた2Dリストが生成されます。もちろん、Listで作業する必要はありません(例:遅延性の場合はseq、パフォーマンスの場合はArray)。

let (|Black|Red|) input = if fst input % 3 = 0 || snd input % 3 = 0 then Black else Red 
let matchColor = 
    function 
    |Black -> Color.Black 
    |Red -> Color.Red 
let color3 = List.init 800 (fun i -> List.init 480 (fun j -> matchColor (i,j))) 

let color4 = color3 |> List.concat 
color4 |> Seq.length 

colors 
|> Array2D.mapi (fun i j x -> color3.[i].[j] = colors.[i,j]) 
|> Seq.cast<bool> 
|> Seq.filter not