簡體   English   中英

如何在F#中將2D數組轉換為1D功能?

[英]How can I convert a 2D array to 1D functionally, in F#?

如果我使用可變計數器和2 for循環,我可以輕松地完成它,但我想在Array.init函數中進行。

到目前為止,我只需要更改array2D.[0, 0]的零array2D.[0, 0]

let array2D = Array2D.init 10 10 (fun i j -> 0)

let array = Array.init 100 (fun i -> array2D.[0, 0])

您完全可以使用/和%的組合來執行此操作,例如:

// assume a 2d array array2d
let m = Array2D.length1 array2d
let n = Array2D.length2 array2d
let array1d = Array.init (m * n) (fun i -> array2d.[i / n, i % n]

這將是“純粹的功能”。 然而,大量使用除法,尤其是模數,不太可能特別有效。 如果表現是一個問題,你做的事情確實會好得多:

// assume a 2d array array2d
let m = Array2D.length1 array2d
let n = Array2D.length2 array2d
let array1d = Array.zeroCreate (m * n)
for i = 0 to (m - 1) do
  for j = 0 to (n - 1) do
    array1d.[(i * n) + j)] <- array2d.[i,j]

F#是不是熱心功能專用的第一 functional-。 當表現是一個主要問題時,使用命令式的風格是很好的。 這就是為什么它是一個選擇。 可能最好將上面的內容變成一個引用透明的函數,例如make1darrayfrom2darray

let make1darrayfrom2darray array2d = 
    let m = Array2D.length1 array2d
    let n = Array2D.length2 array2d
    let array1d = Array.zeroCreate (m * n)
    for i = 0 to (m - 1) do
      for j = 0 to (n - 1) do
        array1d.[(i * n) + j] <- array2d.[i,j]
    array1d

如果您這樣做很多但是您的陣列不是很長壽(特別是如果您需要大型陣列),請考慮使用 ArrayPool 系統 這將有助於您的程序避免許多可能昂貴但不必要的內存分配。

我想了一些,並且做對了。 對不起,快速發布,應該花一點時間。

array2D.[i / 10, i % 10]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM