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

[dennou-ruby:001745] Ruby/GSL 0.3.9



  電脳倶楽部のみなさま

  Ruby/GSL をアップデートしました。線型代数あたりのバグ
フィックスと、NArray 関係の更新が主です。

> 想定している使い方は、NArray で計算していて、一時的にGSL 
> の機能を使いたいので、Vector に変換して計算したのち、また
> 戻す、というようなものです

  これではあまりにださいので、仕様を変更しました。使い易い
仕様がどのようなものかはまだ指向錯誤の段階なので、NArray を
普段使っておられる方々のコメントをいただけるとありがたいです。
以下、少々長くなりますが変更内容を書いておきます。

  * これまで:
    * GSL::Vector#to_na  ---> Vector  -> NArray メモリは新たに割り当て
    * GSL::Vector.to_gv  ---> NArray  -> Vector 以下同じ
    * GSL::Matrix#to_na  ---> Vector  -> NMatrix 以下同じ
    * GSL::Matrix.to_gm  ---> NMatrix -> Matrix 以下同じ

  * 今回:
    * GSL::Vector#to_na      ---> 前と同じ動作
   ** GSL::Vector.to_gv(na)  ---> NArray -> Vector::View 
                              データは元の NArray の領域を指す
    * GSL::Matrix#to_na      ---> 前と同じ動作
   ** GSL::Matrix.to_gm(na)  ---> NMatrix -> Matrix::View
                              データは元の NMatrix の領域を指す

  * 詳細:
    * Vector::View, Matrix::View は、それぞれ Vector, Matrix 
      を継承したクラス。
    * GSL レベルでは、gsl_vector, gsl_vector_view に対応。

        struct {
          size_t size;
	  double *data;
  	  int owner;
        } gsl_vector;

        struct {
          gsl_vector
        } gsl_vector_view; 

      gsl_vector_view は gsl_vector のデータの参照として使われる。
      gsl_vector を引数にとる関数にはそのまま渡せる。owner が 1, 0 
      で view かどうかが判断され、view は決して double *data のオ
      ーナーにはなれない(誰か他の人が割り当てたデータ領域をポイント
      するのみ)。例えば、view に対して gsl_vector_free() を呼出し
      てもデータ領域は解放されない。

   * Vector.new, Matrix.new に NArray を渡すと、新しいメモリを割り
     当ててそこにデータをコピー。返すのは Vector, Matrix クラスの
     オブジェクト。これは以前と同じ。

   * Vector.to_gv, Matrix.to_gm に NArray を渡すと、Vector::View, 
     Matrix::View を作る。新たなメモリ割り当ては行わず、NArray の
     データ領域を指すポインタを保持。

   * View オブジェクトは、操作上は Vector, Matrix と全く同じに振
     舞い、Vector/Matrix のメソッドはそのまま使える。ただし、独自
     のデータメモリを持つわけではないので、View への変更は、元のデ
     ータの変更と等価。

  したがって、NArray オブジェクトを使って計算している際、一度

     vref = Vector.to_gv(na)     # vref.class ---> GSL::Vector::View

などとして Vector として扱える「参照」を作っておけば、vref を通して 
GSL の機能は全て使えることになります。vref をまた to_na で戻す必要は
ありません。ベクトルデータ自身を変更するメソッドを呼出すと、元の
NArrayのデータも変更されます。これには注意が必要ではありますが、むし
ろ望ましい動作とも思われます。

#  現在の難点:Ruby/GSL には double のベクトル・行列しかないので、
# 上の仕様全てが満されるのは NArray.float, NMatrix.float に対して
# のみです。

  Vector.to_gv(na) という形式は、少し冗長にも感じられますが、例えば 
na.to_gv のような、NArray にメソッドを追加するようなことは、現在まで
のところ避けています。

  また、先日西澤さんよりリクエストのあった

   * GSL::Vector.new(NArray object)
   * GSL::Stats.covariance(NArray object, NArray object)

は、通るようになっています。前者は上に書いたことそのままです。
後者の形式は、Vector.to_gv でいったん参照を作ってもらっておいて
からやるというのが上の変更の意図ですが、Stats モジュールのみ、NArray 
オブジェクトをそのまま受け取れるように変更してあります。

----------------------------------------------------------
  常定 芳基  Yoshiki Tsunesada (y.tsunesada@xxxxxxxxx)
    国立天文台 重力波プロジェクト推進室
      TEL: +81-422-34-3625
      FAX: +81-422-34-3793