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

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



ごとけんです

In message "[dennou-ruby:000071] Re: gtrb & multi-D array"
    on 99/09/03, Numaguti Atusi <numa@xxxxxx> writes:
>ところで,まとめの,
>  スピードをある程度確保しなければならない
>        文字列で別言語を書いて呼び出すとかしてオブジェクトを生成せずに数
>        値を触る方法は必要
>はどういうことなんでしょう. 

これについては時間ないので触れない可能性大ですが、

>多分やりそうなことで速度的に問題になるのは,Ruby で書いた
>自前のメソッドを,配列の全データに当てはめたい,などと
>いうときでしょうか.
>
>もちろん,これもメソッドの内容が単純な演算なら,その演算を
>Numeric クラスでなく,上述のような配列クラスに適用すれば
>よいわけですが,条件判断などが入ってくると苦しい.

そうですそうです。

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

たとえば each みたいのを使いたくなることはどうしてもありそうですが
このとき、
data.each{|x| x**x} 
程度でも、各要素をオブジェクト化する必要があるわけですね。
いちばん大きなオーバーヘッドはオブジェクト化なので。

>しかし,
>   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 とかで書かれたメソッド )
>     
>でも,制御構造が複雑だと難しいですね.限界がある.
>昔のベクトル計算機を使っているみたい...

昔のVPって(いまでも?? > 中島さん)そんなことしてたですか。うーむ。

-- gotoken