[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:000217] NumArray prototype in ruby



堀之内です。

NumArray の ruby によるプロトタイプの試作品(長い..)を作ってみ
ました。

  ftp://dennou-t.ms.u-tokyo.ac.jp/arch/davis/ex/2000-02-06-horinout/

以下の num_array-20000206.tar またはその展開ファイル num_array/ です。
使用法は numarray.rb の最後のテスト部分を参照してください。実行は

  % ruby numarray.rb

です。

今回作ったものは、かつて NMDArray と称して作ったものと基本的に同
じですが、若干ちがいます:

#0. 名前

一次元配列   BasicNumArray
多次元配列   NumArray

#1. クラス構成

サブセット等をとるときに必要な「配列の添字」をクラス ArrayIndex 
として独立させました。詳しくは README_arrayindex を参照。

#2. マスキング

インデックスとして true と false(またはnil) からなる「論理型」配
列を取れるようにしました。trueのところだけ取り出したり([]メソッ
ドで)、書き込んだり([]=メソッドで)するためです。よって 
BasicNumArray でも論理型に対応するものが欲しいです。要は true と 
false が区別できればいいので実体は整数でも構いませんが、もったい
ないのでバイト型が欲しいです > ごとけんさん。ちなみに配列が論理
型かどうかはメソッド logical? が true を返す(正確には flaseまた
はnil以外を返す)かどうかで判定しています。で、mask の要素が 
false/nil 以外のインデックスを選択します(要するに各要素に if を
適用して判別している)。

マスキングの主な用途として配列の要素毎の if を想定しています。
Fortran90なら where 構文で行うことに相当します。このため比較演算
メソッド le (=less or equal), gt (=greater than) 等を定義し、マ
スクを返すようにしています。例えば

   a[a.le(0.0)] = 0.0 

は配列 a の負の値をゼロにします。これは

   mask = a.le(0.0) ; a[mask] = 0.0

と同等です。メソッドのカッコは省略できますので、a[a.le 0.0]=0.0 
とも書けます。また and, or 演算メソッドはそれぞれ and_ と or_ で
す(アンダースコアに注意)。"le" 等の代りに演算子 "<=" 等を再定義す
ることも考えられますが、&&,||,and,or は再定義できません。<= を許
すと必ず (a <= b) && (b <= c) と書くバグに悩まされますから、しな
いほうがいいです。

マスキングは各次元に関しても適用できます。例えばこんな感じ:

  u_NH_average = u_wind[ true , lat.gt 0 ].average

(averageは未実装です。インデックスの true は 0..-1 と同じで全選
択。)


#3. NMDArray のいくつかの機能 (transposeとか次元拡張と平均とか) 
   は未実装。


堀之内 武                 horinout@xxxxxx
京都大学超高層電波研究センター    611-0011 宇治市五ヶ庄
phone:0774-38-3812                     fax:0774-31-8463