2016-10-26 96 views
2

如何將2d數組添加到1d數組中通過將每行添加到上面的數組中?f#將2d數組展開爲1d數組

我的問題是不理解如何使用地圖來做到這一點,因爲其他功能語言有一個平面地圖/(插入類似的名字在這裏)函數來做到這一點。

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到陣列]的可能的複製(http://stackoverflow.com/questions/12870368/array2d-to-array) –

回答

2

如果你只是想壓平它,你可以將它轉換爲一個序列:

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

可能有東西在Array2D這是更方便,但Array2D確實是一個.NET集合。您可以使用不齊整的陣列或列表,然後您可以訪問Seq.concatcollect

ADD1

這已經是在一維列表:

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一個很好的候選。定義黑色和紅色的主動識別器的下方,連同模式匹配,然後生成2D列表,將其輸入到concat,最後針對原始Array2D進行檢查。您當然不需要使用列表(例如,可以將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 
相關問題