module Genarray:sig
..end
type (!'a, !'b, !'c)
t
类型 Genarray.t
是具有可变维度数量的大数组的类型。支持 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
是包含 Fortran 布局中 32 位浮点数的通用 Bigarrays 的类型;此数组中的读写操作使用 OCaml 类型 float
。
val create : ('a, 'b) Bigarray.kind ->
'c Bigarray.layout -> int array -> ('a, 'b, 'c) t
Genarray.create kind layout dimensions
返回一个新的大数组,其元素种类由参数 kind
(float32
、float64
、int8_signed
等之一)确定,其布局由参数 layout
(c_layout
或 fortran_layout
之一)确定。dimensions
参数是一个整数数组,指示大数组在每个维度上的大小。dimensions
的长度决定了大数组的维度数。
例如,Genarray.create int32 c_layout [|4;6;8|]
返回一个新的 32 位整数大数组,采用 C 布局,具有三个维度,三个维度分别为 4、6 和 8。
由 Genarray.create
返回的大数组未初始化:数组元素的初始值未指定。
Genarray.create
如果维度数不在 0 到 16(含)的范围内,或者其中一个维度为负,则引发 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
返回一个新的大数组 b
,其元素种类由参数 kind
(float32
、float64
、int8_signed
等之一)确定,其布局由参数 layout
(c_layout
或 fortran_layout
之一)确定。dimensions
参数是一个整数数组,指示大数组在每个维度上的大小。dimensions
的长度决定了大数组的维度数。
每个元素 Genarray.get b i
初始化为 f i
的结果。换句话说,Genarray.init kind layout dimensions f
将 f
应用于新大数组的索引的结果制成表格,该大数组的布局由 kind
、layout
和 dimensions
描述。索引数组 i
可以在对 f 的调用之间共享和修改。
例如,Genarray.init int c_layout [|2; 1; 3|]
返回一个新的整数大数组,采用 C 布局,具有三个维度(分别为 2、1、3),元素值为 0、1、2、1、2、3。
(Array.fold_left (+) 0)
Genarray.init
如果维度数不在 0 到 16(含)的范围内,或者其中一个维度为负,则引发 Invalid_argument
。
val num_dims : ('a, 'b, 'c) t -> int
返回给定大数组的维度数。
val dims : ('a, 'b, 'c) t -> int array
Genarray.dims a
返回大数组 a
的所有维度,作为一个长度为 Genarray.num_dims a
的整数数组。
val nth_dim : ('a, 'b, 'c) t -> int -> int
Genarray.nth_dim a n
返回大数组 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
返回给定大数组的种类。
val layout : ('a, 'b, 'c) t -> 'c Bigarray.layout
返回给定大数组的布局。
val change_layout : ('a, 'b, 'c) t ->
'd Bigarray.layout -> ('a, 'b, 'd) t
Genarray.change_layout a layout
返回一个具有指定 layout
的大数组,与 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
通过限制第一个(最左侧)维度来提取给定大数组的子数组。Genarray.sub_left a ofs len
返回一个与 a
具有相同维度数的大数组,并且与 a
具有相同的维度,除了第一个维度,它对应于 a
的第一个维度的区间 [ofs ... ofs + len - 1]
。不涉及元素复制:子数组和原始数组共享相同的存储空间。换句话说,子数组中坐标为 [|i1; ...; iN|]
的元素与原始数组 a
中坐标为 [|i1+ofs; ...; iN|]
的元素相同。
Genarray.sub_left
仅适用于 C 布局的大数组。
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
通过限制最后一个(最右侧)维度来提取给定大数组的子数组。Genarray.sub_right a ofs len
返回一个与 a
具有相同维度数的大数组,并且与 a
具有相同的维度,除了最后一个维度,它对应于 a
的最后一个维度的区间 [ofs ... ofs + len - 1]
。不涉及元素复制:子数组和原始数组共享相同的存储空间。换句话说,子数组中坐标为 [|i1; ...; iN|]
的元素与原始数组 a
中坐标为 [|i1; ...; iN+ofs|]
的元素相同。
Genarray.sub_right
仅适用于 Fortran 布局的大数组。
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|]
返回 a
的“切片”,该切片通过将前 M
个坐标设置为 i1
、...、iM
获得。如果 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|]
返回 a
的“切片”,该切片通过将最后 M
个坐标设置为 i1
、...、iM
获得。如果 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
。