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

[dennou-ruby:002111] Re: チュー トリアル



 堀之内様、皆様
 常定@天文台です。

> NArrayサポートが増えたのは大変喜ばしいです。ところで、つい最近補
> 間の必要があってGSLについてちょっと調べました。補間に使う元デー
> タは当然配列的なデータになりますが、私が見落としてなければ、補間
> 先の指定に関しては、GSLでは一点のみ指定する関数があるだけのよう
> です(つまり1コールで1点分の補間を行う)。
 おっしゃる通りです。
# GSLでは、「ワンステップ」計算のルーチンは豊富にあるのですが、
# 計算を進めて行く「ドライバ」的ルーチンは、ODE以外には
# あまりありません。

> 用に耐えないケースがでます。それに対処するには、GSLの関数そのま
> まのRubyインターフェースでなく、C でループを回す関数を作り、それ
> に対する Ruby インターフェースを使う必要があります。補間の場合で
> 言えば、補間先の指定を NArray で受け付け、その各要素に対してルー
> プを回せばいいので、やることは単純です。
> このように大量データの処理という観点から、CでGSLの応用関数を書い
> た上で Ruby インターフェースを作られる計画はお持ちでしょうか。
> (..そうなればいいな、と思ってます。有り体に言えば。。。 (^^;) )
 実は、現状でそれが可能です(ドキュメントに書いとくべきでしたね。付属
のサンプルスクリプトでもそれを使っていませんし)。補完した値を計算す
るメソッド Interp#eval(x),Spline#eval(x) は、x として
Numeric、GSL::Vector, GSL::Matrix,それに NArray を取る
ことができ、内部でループを回して、x と同じクラスのオブジェクトとして
返します。例えば以下のようなスクリプトが書けます。

  #!/usr/bin/env ruby
  require("gsl")
  # データファイルを読んでベクトルを作る
  x, y = Vector.filescan("data.dat")
  # Splineオブジェクト生成
  sp = Spline.alloc(x, y)
  # a: 補完したい点の集合, linspace はMatlab/Octaveから
   # 拝借したもので、GSLには対応する関数なし
  a = Vector.linspace(x[0], x[-1], 100)
  # b: 補完された値の集合
  b = sp.eval(a)  # b は GSL::Vector, len=100

x, y, a はNArray でもよく、例えば a -> a.to_na と
してもそのまま動きます。この場合、b も NArray になります。

 その他、ベクトルを渡してループを回したくなるようなメソッドは、
(思いつく限り)それができるようにしてあります。GSL::Vector,
GSL::Matrixに関しては以前のバージョンからできるようになって
いたのですが、今回のバージョンアップは、さらに(いちいちto_gv
しなくとも直接) NArray も受け取れるようにした、ということです。
(いじめてみて、できないメソッドがあったらリクエストしていただけ
るとありがたいです)

  dlというのは、知らなかったですね、、、何するものなんでしょう?

-------------------------------------
  常定 芳基  Yoshiki TSUNESADA
    国立天文台 重力波プロジェクト室
       181-8588 東京都三鷹市大沢2−21−1
       TEL: 0422-34-3625