模块 Bigarray.Genarray

module Genarray: sig .. end

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

类型 Genarray.t 是具有可变维度数量的大数组的类型。支持 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 是包含 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 返回一个新的大数组,其元素种类由参数 kindfloat32float64int8_signed 等之一)确定,其布局由参数 layoutc_layoutfortran_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,其元素种类由参数 kindfloat32float64int8_signed 等之一)确定,其布局由参数 layoutc_layoutfortran_layout 之一)确定。dimensions 参数是一个整数数组,指示大数组在每个维度上的大小。dimensions 的长度决定了大数组的维度数。

每个元素 Genarray.get b i 初始化为 f i 的结果。换句话说,Genarray.init kind layout dimensions ff 应用于新大数组的索引的结果制成表格,该大数组的布局由 kindlayoutdimensions 描述。索引数组 i 可以在对 f 的调用之间共享和修改。

例如,Genarray.init int c_layout [|2; 1; 3|]
      (Array.fold_left (+) 0)
返回一个新的整数大数组,采用 C 布局,具有三个维度(分别为 2、1、3),元素值为 0、1、2、1、2、3。

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

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 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

通过限制第一个(最左侧)维度来提取给定大数组的子数组。Genarray.sub_left a ofs len 返回一个与 a 具有相同维度数的大数组,并且与 a 具有相同的维度,除了第一个维度,它对应于 a 的第一个维度的区间 [ofs ... ofs + len - 1]。不涉及元素复制:子数组和原始数组共享相同的存储空间。换句话说,子数组中坐标为 [|i1; ...; iN|] 的元素与原始数组 a 中坐标为 [|i1+ofs; ...; iN|] 的元素相同。

Genarray.sub_left 仅适用于 C 布局的大数组。

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 布局的大数组。

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 获得。如果 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|] 返回 a 的“切片”,该切片通过将最后 M 个坐标设置为 i1、...、iM 获得。如果 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 dstsrc 中的所有元素复制到 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