[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9.1 gauche.array - 配列

Module: gauche.array

このモジュールは多次元配列のデータタイプとそれに関する操作を提供します。 プリミティブなAPIはSRFI-25で定義されているものに従います。 任意のSchemeオブジェクトを保持できるSRFI-25の汎用配列の他に、 均一な数値ベクタ(gauche.uvector - ユニフォームベクタ参照)を使って 数値要素を効率良く保持する配列型も提供されます。 また、SRFI-10を使った配列の外部表現も実装されます。

N次元の配列の各エレメントはN個の整数のインデックス [ i_0 i_1i_N-1 ]でアクセスされます。 配列は、各次元のインデックスの下限s_kおよび上限e_kを決める shapeを持っています。ここで、s_k <= e_kであり、 k次元目のインデックスi_ks_k <= i_k < e_k を満たすものとします。 (s_k == e_k であるような配列も作れますが、 その配列にはデータをストアすることはできません。 また、0次元の配列は作れます。それは一つだけデータを保持できます)。 Shapeはそれ自体が [ D x 2 ] の配列です。 ここでDはそのshapeが表現する配列の次元数です。

配列のプリミティブに対しインデックスを渡すにはいくつか方法があります。 各インデックスをばらばらの引数として渡すこともできますし、 ベクタや1次元の配列にパックして渡すこともできます。 後者においてインデックスがパックされたベクタや配列を「インデックスオブジェクト」 と呼ぶことがあります。Gaucheでは、配列の要素に次々とアクセスするような処理では ベクタをインデックスオブジェクトとして使うと若干効率が良いでしょう。

配列はequal?手続きで比較することが出来ます。 二つの配列のshapeが等しく、また対応する各要素がequal?の意味で 等しい場合に二つの配列はequal?であると見なされます。

内部的には、配列は1次元のインデックスでアクセスされるバッキングストレージと、 多次元のインデックスをバッキングストレージへのインデックスにマップする手続きとから 構成されています。

Class: <array-base>

配列に関する汎用操作を実装している、抽象ベースクラスです。 実際に配列のインスタンスを作るには、以下のいずれかの具体クラスを使って下さい。

Class: <array>
Class: <u8array>
Class: <s8array>
Class: <u16array>
Class: <s16array>
Class: <u32array>
Class: <s32array>
Class: <u64array>
Class: <s64array>
Class: <f16array>
Class: <f32array>
Class: <f64array>

具体配列クラスです。<array>クラスはsrfi-25互換の配列、 すなわち、任意のSchemeオブジェクトを格納できる配列を実装します。 <u8array>から<f64array>までは、 それぞれ<u8vector>から<f64vector>をバッキングストレージとして 用いる配列を実装し、制限された範囲の整数もしくは不正確な実数のみを 効率良く格納することができます。

Reader syntax: #,(<array> shape obj …)

配列はこの形式で書き出されます。 (配列が例えば<u8array>であるなら、<array>の部分は<u8array> となります。) shapeは偶数個の整数のリストで、 2n番目の整数がn次元目のインデックスの下限を、2n+1番目の 整数がn次元目のインデックスの上限(+1)を表します。 その後に、配列の要素がrow-majorの順で書き出されます。

この構文が読み込まれると、もとの配列とequal?である配列が作成されます。

 
; 次のような配列:
;   8 3 4
;   1 5 9
;   6 7 2
#,(<array> (0 3 0 3) 8 3 4 1 5 9 6 7 2)

; 4x4の単位行列
#,(<array> (0 4 0 4) 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1)
Function: array? obj

[SRFI-25] objが配列であれば#tが、そうでなければ#fが返されます。 (is-a? obj <array-base>)と等価です。

Function: make-array shape &optional init

[SRFI-25] Shapeがshapeである配列を作成します。 Shapeは [ D x 2 ] の配列で、 0 <= k < D なる各kに対して要素 [ k 0 ] は 要素[ k 1 ]以下でなければなりません。 initが与えられた場合は、配列の各要素がinitで初期化されます。 initが与えられなかった場合の配列の要素の初期値は不定です。

 
(make-array (shape 0 2 0 2 0 2) 5)
 ⇒ #,(<array> (0 2 0 2 0 2) 5 5 5 5 5 5 5 5)
Function: make-u8array shape &optional init
Function: make-s8array shape &optional init

Function: make-f32array shape &optional init
Function: make-f64array shape &optional init

make-arrayと似ていますが、均一な数値配列を返します。

Function: shape bound …

[SRFI-25] 偶数個の正確な整数を引数に取り、配列のshapeとして使える2次元の配列を返します。

 
(shape 0 2 1 3 3 5)
 ⇒ #,(<array> (0 3 0 2) 0 2 1 3 3 5)

(shape)
 ⇒ #,(<array> (0 0 0 2))
Function: array shape init …

[SRFI-25] Shapeがshapeであるような配列を作成し、 その要素をinit …で初期化します。

 
(array (shape 0 2 1 3) 'a 'b 'c 'd)
 ⇒ #,(<array> (0 2 1 3) a b c d)
Function: array-rank array

[SRFI-25] 配列arrayの次元数を返します。

 
(array-rank (make-array (shape 0 2 0 2 0 2))) ⇒ 3
(array-rank (make-array (shape))) ⇒ 0
Function: array-shape array

配列arrayのshapeを表す配列を返します。

Function: array-start array dim
Function: array-end array dim
Function: array-length array dim

[SRFI-25+] array-startは配列arraydim番目の次元の インデックスの下限を返します。 array-endは上限+1を、そしてarray-lengthは両者の差を返します。 array-startarray-endはSRFI-25で定義されています。

 
(define a (make-array (shape 1 5 0 2)))

(array-start a 0)  ⇒ 1
(array-end a 0)    ⇒ 5
(array-length a 0) ⇒ 4
(array-start a 1)  ⇒ 0
(array-end a 1)    ⇒ 2
(array-length a 1) ⇒ 2
Function: array-size array

配列arrayの全要素数を返します。

 
(array-size (make-array (shape 5 9 1 3))) ⇒ 8
(array-size (make-array (shape))) ⇒ 1
(array-size (make-array (shape 0 0 0 2))) ⇒ 0
Function: array-ref array k …
Function: array-ref array index

[SRFI-25] 配列arrayの要素を取り出します。最初の形式では、 要素は整数のインデックスk …で指定されます。 2番目の形式では、要素はベクタまたは1次元配列のインデックスオブジェクトindex で指定されます。

Function: array-set! array k … value
Function: array-set! array index value

[SRFI-25] 配列arrayの要素にvalueをセットします。 最初の形式では、 要素は整数のインデックスk …で指定されます。 2番目の形式では、要素はベクタまたは1次元配列のインデックスオブジェクトindex で指定されます。

Function: share-array array shape proc

[SRFI-25] Shapeがshapeであり、与えられた配列arrayとバッキングストレージを 共有する新しい配列を作成して返します。 procは、新しい配列へのインデックスを古い配列へのインデックスへ マップする手続きです。新しい配列の次元数をn、古い配列の次元数をmと した時、procn個の引数を取りm個の値を返す手続きでなければ なりません。さらに、各マッピングはaffineマッピング、すなわち、 出力は入力の線形合成(プラス定数)でなければなりません。 (share-arrayprocがaffineマッピングであるという事実に基づいた 最適化を行います。新しい配列にアクセスする度にprocが呼ばれるというわけでは ありません)。

Function: array-for-each-index array proc &optional index
Function: shape-for-each shape proc &optional index
Function: tabulate-array shape proc &optional index
Function: array-retabulate! array shape proc &optional index
Function: array-retabulate! array proc &optional index
Function: array-map! array shape proc array0 array1 …
Function: array-map! array proc array0 array1 …
Function: array-map shape proc array0 array1 …
Function: array-map proc array0 array1 …
Function: array->vector array
Function: array->list array
Function: array-concatenate a b &optional dimension
Function: array-transpose array &optional dim1 dim2
Function: array-rotate-90 array &optional dim1 dim2
Function: array-flip array &optional dimension
Function: array-flip! array &optional dimension
Function: identity-array dimension &optional class
Function: array-inverse array
Function: determinant array
Function: determinant! array
Function: array-mul a b
Function: array-expt array pow
Function: array-div-left a b
Function: array-div-right a b
Function: array-add-elements array array-or-scalar …
Function: array-add-elements! array array-or-scalar …
Function: array-sub-elements array array-or-scalar …
Function: array-sub-elements! array array-or-scalar …
Function: array-mul-elements array array-or-scalar …
Function: array-mul-elements! array array-or-scalar …
Function: array-div-elements array array-or-scalar …
Function: array-div-elements! array array-or-scalar …

[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.