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

[dennou-ruby:000071] Re: gtrb & multi-D array



沼口です.

 > あと、内緒ですが、
 > http://www.jus.or.jp/workshop/ruby/

なるほどなるほど,です.

ところで,まとめの,
  スピードをある程度確保しなければならない
        文字列で別言語を書いて呼び出すとかしてオブジェクトを生成せずに数
        値を触る方法は必要
はどういうことなんでしょう. 

時間を食うのは,配列に入ったデータの各要素に対する一斉処理で
あることが多いので,配列内容を(ポインタ渡しで)直接 fortran 
なり C なりでさわれるようなクラスを作っておけば,そのような
よく使う一斉処理をするルーチンを書いておけばよいわけですよね.
データ同士の四則演算,平均をとる,座標変換 etc. etc.

多分やりそうなことで速度的に問題になるのは,Ruby で書いた
自前のメソッドを,配列の全データに当てはめたい,などと
いうときでしょうか.

もちろん,これもメソッドの内容が単純な演算なら,その演算を
Numeric クラスでなく,上述のような配列クラスに適用すれば
よいわけですが,条件判断などが入ってくると苦しい.

つまり,
   def t2theta(p)
       self * (P0/p)**K
   end
くらいの簡単な式をあてはめるのならば,
配列の各要素同士の四則演算や各種初等関数くらいを C か fortran で
用意しておけばよい.

しかし,
   def t2theta2(p)
       if (p>=0) 
         self * (P0/p)**K
       else
         self * (-p/P0)**K
       end
   end
とか条件判断が入ってくると少し苦しくなる,でも,なんとかはなる.
たとえば,こう変換して,
   def t2theta2(p)
     s = sign(1.0,p)
     self * ( (P0/p)**K * s + (-p/P0)**K * (1.0-s) )
   end
あるは,もっとかっこよく
   def t2theta2(p)
       ( self * (P0/p)**K  ).if_ge(p,0.0) |
       ( self * (-p/P0)**K )
   end
とか
( if_ge(p,0.0) は pの対応要素が >=0 なら self, それ以外なら nilを返す.
  |(x) は self の要素が nil なら xの対応要素を,それ以外なら self を返す,
  実際には C とかで書かれたメソッド )
     
でも,制御構造が複雑だと難しいですね.限界がある.
昔のベクトル計算機を使っているみたい...

-- 
沼口  敦@北海道大学大学院地球環境科学研究科 大気海洋圏環境科学専攻
tel:011-706-2365 fax:011-706-4865 〒060-0810 札幌市北区北10条西5丁目  
numa@xxxxxx