module Genarray:sig
..end
type (!'a, !'b, !'c)
t
類型 Genarray.t
是具有可變維度數的 Bigarray 的類型。支援 0 到 16 之間的任何維度數。
Genarray.t
的三個類型參數識別了陣列元素的種類和佈局,如下所示:
'a
是用於存取陣列元素的 OCaml 類型(float
、int
、int32
、int64
、nativeint
);'b
是陣列元素的實際種類(float32_elt
、float64_elt
、int8_signed_elt
、int8_unsigned_elt
等);'c
識別了陣列佈局(c_layout
或 fortran_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
決定(float32
、float64
、int8_signed
等之一),其佈局由參數 layout
決定(c_layout
或 fortran_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
決定(float32
、float64
、int8_signed
等之一),其佈局由參數 layout
決定(c_layout
或 fortran_layout
之一)。dimensions
參數是一個整數陣列,指示 Bigarray 在每個維度中的大小。dimensions
的長度決定了 Bigarray 的維度數。
每個元素 Genarray.get b i
都初始化為 f i
的結果。換句話說,Genarray.init kind layout dimensions f
會將 f
應用於新的 Bigarray 的索引結果製成表格,該 Bigarray 的佈局由 kind
、layout
和 dimensions
描述。索引陣列 i
可能會在呼叫 f 之間共享和變更。
例如,Genarray.init int c_layout [|2; 1; 3|]
會傳回一個新的整數 Bigarray,以 C 佈局,具有三個維度(分別為 2、1、3),元素值為 0、1、2、1、2、3。
(Array.fold_left (+) 0)
如果維度數不在 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
。
n
小於 0 或大於或等於 Genarray.num_dims a
,則引發 Invalid_argument
。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 a
是 a
中的元素數乘以 a
的 Bigarray.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.{...}
保留給存取一維、二維和三維陣列,如下所述。)
a
沒有剛好 N
個維度,或者座標超出陣列界限,則引發 Invalid_argument
。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。
ofs
和 len
沒有指定 a
的有效子陣列,亦即如果 ofs < 0
,或 len < 0
,或 ofs + len > Genarray.nth_dim a 0
,則引發 Invalid_argument
。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。
ofs
和 len
沒有指定 a
的有效子陣列,亦即如果 ofs < 1
,或 len < 0
,或 ofs + len > Genarray.nth_dim a (Genarray.num_dims a - 1)
,則引發 Invalid_argument
。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
的「切片」。如果 a
有 N
個維度,則該切片會有 N - M
個維度,且該切片中座標 [|j1; ...; j(N-M)|]
的元素會與原始陣列 a
中座標 [|i1; ...; iM; j1; ...; j(N-M)|]
的元素相同。 不會複製元素:切片和原始陣列共享相同的儲存空間。
Genarray.slice_left
僅適用於 C 排列的 Bigarray。
Invalid_argument
,如果 M >= N
,或如果 [|i1; ... ; iM|]
超出 a
的範圍。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
的「切片」。如果 a
有 N
個維度,則該切片會有 N - M
個維度,且該切片中座標 [|j1; ...; j(N-M)|]
的元素會與原始陣列 a
中座標 [|j1; ...; j(N-M); i1; ...; iM|]
的元素相同。 不會複製元素:切片和原始陣列共享相同的儲存空間。
Genarray.slice_right
僅適用於 Fortran 排列的 Bigarray。
Invalid_argument
,如果 M >= N
,或如果 [|i1; ... ; iM|]
超出 a
的範圍。val blit : ('a, 'b, 'c) t -> ('a, 'b, 'c) t -> unit
將一個 Bigarray 的所有元素複製到另一個 Bigarray 中。 Genarray.blit src dst
會將 src
的所有元素複製到 dst
中。 兩個陣列 src
和 dst
必須具有相同的維度數量和相等的維度。 可透過將 Genarray.blit
應用於 src
和 dst
的子陣列或切片,以達成將 src
的子陣列複製到 dst
的子陣列。
val fill : ('a, 'b, 'c) t -> 'a -> unit
將 Bigarray 的所有元素設定為給定的值。 Genarray.fill a v
會將值 v
儲存到 Bigarray a
的所有元素中。 可透過將 Genarray.fill
應用於 a
的子陣列或切片,以達成僅將 a
的某些元素設定為 v
。