模組 Bigarray.Genarray

module Genarray: sig .. end

type (!'a, !'b, !'c) t 

類型 Genarray.t 是具有可變維度數的 Bigarray 的類型。支援 0 到 16 之間的任何維度數。

Genarray.t 的三個類型參數識別了陣列元素的種類和佈局,如下所示:

  • 第一個參數 'a 是用於存取陣列元素的 OCaml 類型(floatintint32int64nativeint);
  • 第二個參數 'b 是陣列元素的實際種類(float32_eltfloat64_eltint8_signed_eltint8_unsigned_elt 等);
  • 第三個參數 'c 識別了陣列佈局(c_layoutfortran_layout)。

例如,(float, float32_elt, fortran_layout) Genarray.t 是通用 Bigarray 的類型,其中包含 Fortran 佈局的 32 位元浮點數;在此陣列中讀取和寫入使用 OCaml 類型 float

val create : ('a, 'b) Bigarray.kind ->
'c Bigarray.layout -> int array -> ('a, 'b, 'c) t

Genarray.create kind layout dimensions 會傳回一個新的 Bigarray,其元素種類由參數 kind 決定(float32float64int8_signed 等之一),其佈局由參數 layout 決定(c_layoutfortran_layout 之一)。dimensions 參數是一個整數陣列,指示 Bigarray 在每個維度中的大小。dimensions 的長度決定了 Bigarray 的維度數。

例如,Genarray.create int32 c_layout [|4;6;8|] 會傳回一個新的 32 位元整數 Bigarray,以 C 佈局,具有三個維度,這三個維度分別為 4、6 和 8。

Genarray.create 傳回的 Bigarray 未初始化:陣列元素的初始值未指定。

如果維度數不在 0 到 16(含)的範圍內,或者其中一個維度為負數,則 Genarray.create 會引發 Invalid_argument

val init : ('a, 'b) Bigarray.kind ->
'c Bigarray.layout ->
int array -> (int array -> 'a) -> ('a, 'b, 'c) t

Genarray.init kind layout dimensions f 會傳回一個新的 Bigarray b,其元素種類由參數 kind 決定(float32float64int8_signed 等之一),其佈局由參數 layout 決定(c_layoutfortran_layout 之一)。dimensions 參數是一個整數陣列,指示 Bigarray 在每個維度中的大小。dimensions 的長度決定了 Bigarray 的維度數。

每個元素 Genarray.get b i 都初始化為 f i 的結果。換句話說,Genarray.init kind layout dimensions f 會將 f 應用於新的 Bigarray 的索引結果製成表格,該 Bigarray 的佈局由 kindlayoutdimensions 描述。索引陣列 i 可能會在呼叫 f 之間共享和變更。

例如,Genarray.init int c_layout [|2; 1; 3|]
      (Array.fold_left (+) 0)
會傳回一個新的整數 Bigarray,以 C 佈局,具有三個維度(分別為 2、1、3),元素值為 0、1、2、1、2、3。

如果維度數不在 0 到 16(含)的範圍內,或者其中一個維度為負數,則 Genarray.init 會引發 Invalid_argument

val num_dims : ('a, 'b, 'c) t -> int

傳回給定 Bigarray 的維度數。

val dims : ('a, 'b, 'c) t -> int array

Genarray.dims a 會傳回 Bigarray a 的所有維度,作為長度為 Genarray.num_dims a 的整數陣列。

val nth_dim : ('a, 'b, 'c) t -> int -> int

Genarray.nth_dim a n 會傳回 Bigarray a 的第 n 個維度。第一個維度對應於 n = 0;第二個維度對應於 n = 1;最後一個維度對應於 n = Genarray.num_dims a - 1

val kind : ('a, 'b, 'c) t -> ('a, 'b) Bigarray.kind

傳回給定 Bigarray 的種類。

val layout : ('a, 'b, 'c) t -> 'c Bigarray.layout

傳回給定 Bigarray 的佈局。

val change_layout : ('a, 'b, 'c) t ->
'd Bigarray.layout -> ('a, 'b, 'd) t

Genarray.change_layout a layout 會傳回具有指定 layout 的 Bigarray,與 a 共用資料(因此具有與 a 相同的維度)。不涉及複製元素:新陣列和原始陣列共用相同的儲存空間。維度會反轉,因此 C 佈局中的 get v [| a; b |] 會變成 Fortran 佈局中的 get v [| b+1; a+1 |]

val size_in_bytes : ('a, 'b, 'c) t -> int

size_in_bytes aa 中的元素數乘以 aBigarray.kind_size_in_bytes

val get : ('a, 'b, 'c) t -> int array -> 'a

讀取通用 Bigarray 的元素。Genarray.get a [|i1; ...; iN|] 會傳回 a 的元素,其座標為第一個維度的 i1、第二個維度的 i2、...、第 N 個維度的 iN

如果 a 具有 C 佈局,則座標必須大於或等於 0,且嚴格小於 a 的對應維度。如果 a 具有 Fortran 佈局,則座標必須大於或等於 1,且小於或等於 a 的對應維度。

如果 N > 3,則會提供替代語法:您可以寫入 a.{i1, i2, ..., iN},而不是 Genarray.get a [|i1; ...; iN|]。(使用一個、兩個或三個座標的語法 a.{...} 保留給存取一維、二維和三維陣列,如下所述。)

val set : ('a, 'b, 'c) t -> int array -> 'a -> unit

指派通用 Bigarray 的元素。Genarray.set a [|i1; ...; iN|] v 會將值 v 儲存在 a 的元素中,其座標為第一個維度的 i1、第二個維度的 i2、...、第 N 個維度的 iN

陣列 a 必須剛好具有 N 個維度,並且所有座標都必須位於陣列界限內,如 Genarray.get 所述;否則,會引發 Invalid_argument

如果 N > 3,則會提供替代語法:您可以寫入 a.{i1, i2, ..., iN} <- v,而不是 Genarray.set a [|i1; ...; iN|] v。(使用一個、兩個或三個座標的語法 a.{...} <- v 保留給更新一維、二維和三維陣列,如下所述。)

val sub_left : ('a, 'b, Bigarray.c_layout) t ->
int -> int -> ('a, 'b, Bigarray.c_layout) t

透過限制第一個(最左邊)維度,從給定的 Bigarray 中提取子陣列。Genarray.sub_left a ofs len 會傳回一個與 a 具有相同維度數的 Bigarray,以及與 a 相同的維度,但第一個維度除外,該維度對應於 a 的第一個維度的間隔 [ofs ... ofs + len - 1]。不涉及複製元素:子陣列和原始陣列共用相同的儲存空間。換句話說,子陣列的座標 [|i1; ...; iN|] 處的元素與原始陣列 a 的座標 [|i1+ofs; ...; iN|] 處的元素相同。

Genarray.sub_left 僅適用於 C 佈局的 Bigarray。

val sub_right : ('a, 'b, Bigarray.fortran_layout) t ->
int -> int -> ('a, 'b, Bigarray.fortran_layout) t

透過限制最後一個(最右邊)維度,從給定的 Bigarray 中提取子陣列。Genarray.sub_right a ofs len 會傳回一個與 a 具有相同維度數的 Bigarray,以及與 a 相同的維度,但最後一個維度除外,該維度對應於 a 的最後一個維度的間隔 [ofs ... ofs + len - 1]。不涉及複製元素:子陣列和原始陣列共用相同的儲存空間。換句話說,子陣列的座標 [|i1; ...; iN|] 處的元素與原始陣列 a 的座標 [|i1; ...; iN+ofs|] 處的元素相同。

Genarray.sub_right 僅適用於 Fortran 佈局的 Bigarray。

val slice_left : ('a, 'b, Bigarray.c_layout) t ->
int array -> ('a, 'b, Bigarray.c_layout) t

藉由固定給定 Bigarray 的一個或多個最左邊的座標,從中提取一個較低維度的子陣列。 Genarray.slice_left a [|i1; ... ; iM|] 會回傳透過將前 M 個座標設定為 i1, ..., iM 所取得的 a 的「切片」。如果 aN 個維度,則該切片會有 N - M 個維度,且該切片中座標 [|j1; ...; j(N-M)|] 的元素會與原始陣列 a 中座標 [|i1; ...; iM; j1; ...; j(N-M)|] 的元素相同。 不會複製元素:切片和原始陣列共享相同的儲存空間。

Genarray.slice_left 僅適用於 C 排列的 Bigarray。

val slice_right : ('a, 'b, Bigarray.fortran_layout) t ->
int array -> ('a, 'b, Bigarray.fortran_layout) t

藉由固定給定 Bigarray 的一個或多個最右邊的座標,從中提取一個較低維度的子陣列。 Genarray.slice_right a [|i1; ... ; iM|] 會回傳透過將最後 M 個座標設定為 i1, ..., iM 所取得的 a 的「切片」。如果 aN 個維度,則該切片會有 N - M 個維度,且該切片中座標 [|j1; ...; j(N-M)|] 的元素會與原始陣列 a 中座標 [|j1; ...; j(N-M); i1; ...; iM|] 的元素相同。 不會複製元素:切片和原始陣列共享相同的儲存空間。

Genarray.slice_right 僅適用於 Fortran 排列的 Bigarray。

val blit : ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit

將一個 Bigarray 的所有元素複製到另一個 Bigarray 中。 Genarray.blit src dst 會將 src 的所有元素複製到 dst 中。 兩個陣列 srcdst 必須具有相同的維度數量和相等的維度。 可透過將 Genarray.blit 應用於 srcdst 的子陣列或切片,以達成將 src 的子陣列複製到 dst 的子陣列。

val fill : ('a, 'b, 'c) t -> 'a -> unit

將 Bigarray 的所有元素設定為給定的值。 Genarray.fill a v 會將值 v 儲存到 Bigarray a 的所有元素中。 可透過將 Genarray.fill 應用於 a 的子陣列或切片,以達成僅將 a 的某些元素設定為 v