[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
gauche.array
- 配列 このモジュールは多次元配列のデータタイプとそれに関する操作を提供します。
プリミティブなAPIはSRFI-25で定義されているものに従います。
任意のSchemeオブジェクトを保持できるSRFI-25の汎用配列の他に、
均一な数値ベクタ(gauche.uvector
- ユニフォームベクタ参照)を使って
数値要素を効率良く保持する配列型も提供されます。
また、SRFI-10を使った配列の外部表現も実装されます。
N次元の配列の各エレメントはN
個の整数のインデックス
[ i_0 i_1 … i_N-1 ]
でアクセスされます。
配列は、各次元のインデックスの下限s_kおよび上限e_kを決める
shapeを持っています。ここで、s_k <= e_kであり、
k次元目のインデックスi_kは
s_k <= i_k < e_k を満たすものとします。
(s_k == e_k であるような配列も作れますが、
その配列にはデータをストアすることはできません。
また、0次元の配列は作れます。それは一つだけデータを保持できます)。
Shapeはそれ自体が [ D x 2 ] の配列です。
ここでDはそのshapeが表現する配列の次元数です。
配列のプリミティブに対しインデックスを渡すにはいくつか方法があります。 各インデックスをばらばらの引数として渡すこともできますし、 ベクタや1次元の配列にパックして渡すこともできます。 後者においてインデックスがパックされたベクタや配列を「インデックスオブジェクト」 と呼ぶことがあります。Gaucheでは、配列の要素に次々とアクセスするような処理では ベクタをインデックスオブジェクトとして使うと若干効率が良いでしょう。
配列はequal?
手続きで比較することが出来ます。
二つの配列のshapeが等しく、また対応する各要素がequal?
の意味で
等しい場合に二つの配列はequal?
であると見なされます。
内部的には、配列は1次元のインデックスでアクセスされるバッキングストレージと、 多次元のインデックスをバッキングストレージへのインデックスにマップする手続きとから 構成されています。
配列に関する汎用操作を実装している、抽象ベースクラスです。 実際に配列のインスタンスを作るには、以下のいずれかの具体クラスを使って下さい。
具体配列クラスです。<array>
クラスはsrfi-25互換の配列、
すなわち、任意のSchemeオブジェクトを格納できる配列を実装します。
<u8array>
から<f64array>
までは、
それぞれ<u8vector>
から<f64vector>
をバッキングストレージとして
用いる配列を実装し、制限された範囲の整数もしくは不正確な実数のみを
効率良く格納することができます。
#,(<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) |
[SRFI-25]
objが配列であれば#tが、そうでなければ#fが返されます。
(is-a? obj <array-base>)
と等価です。
[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) |
…
make-array
と似ていますが、均一な数値配列を返します。
[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)) |
[SRFI-25] Shapeがshapeであるような配列を作成し、 その要素をinit …で初期化します。
(array (shape 0 2 1 3) 'a 'b 'c 'd) ⇒ #,(<array> (0 2 1 3) a b c d) |
[SRFI-25] 配列arrayの次元数を返します。
(array-rank (make-array (shape 0 2 0 2 0 2))) ⇒ 3 (array-rank (make-array (shape))) ⇒ 0 |
配列arrayのshapeを表す配列を返します。
[SRFI-25+]
array-start
は配列arrayのdim番目の次元の
インデックスの下限を返します。
array-end
は上限+1を、そしてarray-length
は両者の差を返します。
array-start
とarray-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 |
配列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 |
[SRFI-25] 配列arrayの要素を取り出します。最初の形式では、 要素は整数のインデックスk …で指定されます。 2番目の形式では、要素はベクタまたは1次元配列のインデックスオブジェクトindex で指定されます。
[SRFI-25] 配列arrayの要素にvalueをセットします。 最初の形式では、 要素は整数のインデックスk …で指定されます。 2番目の形式では、要素はベクタまたは1次元配列のインデックスオブジェクトindex で指定されます。
[SRFI-25]
Shapeがshapeであり、与えられた配列arrayとバッキングストレージを
共有する新しい配列を作成して返します。
procは、新しい配列へのインデックスを古い配列へのインデックスへ
マップする手続きです。新しい配列の次元数をn、古い配列の次元数をmと
した時、procはn個の引数を取りm個の値を返す手続きでなければ
なりません。さらに、各マッピングはaffineマッピング、すなわち、
出力は入力の線形合成(プラス定数)でなければなりません。
(share-array
はprocがaffineマッピングであるという事実に基づいた
最適化を行います。新しい配列にアクセスする度にprocが呼ばれるというわけでは
ありません)。
[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] |
This document was generated by Shiro Kawai on November, 22 2009 using texi2html 1.78.