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

[dennou-ruby:002997] Re: Ruby-Lapack



2008/10/9 Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>:
> 堀之内です。
>
> うーむ、明らかに西澤版のほうが使いやすい。ちなみに、linalg ruby
> でググって見たら、トップにでてきたのはなんと3年前に自分で書いた
> 解説文だったりしました。(http://jp.rubyist.net/magazine/?0006-RLR)
> 最後のほうでちょっと Linalg に触れてます。どうりで Linalg 記憶に
> あるわけだ、というか、文章に書いたことを覚えていろよ、
> ですね (^^;)  引用すると、
これは検索をして、見つけていました。
で、読んだ感想で使えなさそうと思って、自分で作り始めました。
一瞬試そうとはしたのですが、インストールに失敗して、止めました。


>
> ということで、やっと登場した使いやすいライブラリが、西澤版と言う
> ことですね。例をみると、1対1ラッパなんだけど、出力引数は戻り値に、
> また、配列の大きさに関する引数は NArray から自動取得することに
> なくしてる、というわけですね。その辺の基本ルールは、目立つところに
> 書いておくといいと思います。あと、自動で書き出される help を
> まとめればドキュメント完成? (すみません、まだ試してないです。)
ヘルプは、
Usage:
 a,b,c = NumRu::Lapack.hoge(x,y,z)
みたいな簡単な引数&戻り値の変数名と、
フォートラン用のマニュアルをべたりと貼り付けているだけです^^;


>> ruby のソースを眺めてみると、なんと引数の最大値は15みたいです。
>
> あれ、16かと思ってた。あまり長い場合は、配列にしろという
> ことなんだと思います。間に合ってますか?
15というのは、
rb_defined_module_function(mHoge, "hoge", rb_hoge, 0以上の値)
としたとき、最後の引数の数を陽に指定し、
VALUE rb_hoge(VALUE self, VALUE arg0, VALUE arg1, ....)
というように定義した場合の制限であり、
rb_defined_module_function(mHoge, "fuga", rb_fuga, -1)
&
VALUE rb_fuga(int argc, VALUE *argv, VALUE self)
のように、-1 を指定した場合は15の制限には引っかからないはずです(たぶん)。

Ruby-Lapack では -1 として、内部で引数の数を調べていますので、
おそらく、15以上でもいけると思います。


>
> # 折角なので、RAA に登録し、ruby-list に流しませんか。
ちょっと整理してからやってみます。


>
>> 西澤です
>>
>> ちょっと linalg を見てみました。
>> 使いたいサブルーチンである dsyevr (倍精度対象行列の固有値固有ベクトル計算。必要な固有値固有ベクトルのみ計算する)を例にします。
>>
>>
>> * 新しく作った Ruby-LAPACK
>> require "numru/lapack"
>> a = NArray[[1,2],[2,3]]
>> m, w, z, isuppz, work, iwork, info, a = NumRu::Lapack.dsyevr("V", "I",
>> "U", a, nil, nil, 1, 2, 0.0, 52, 20)
>>
>>
>> * Linalg
>> require "linalg"
>> include Linalg::XData
>> jobz = Char.new("N")
>> range = Char.new("A")
>> uplo = Char.new("U")
>> n = XInteger.new(na.shape[0])
>> a = DMatrix[[1,2],[2,3]]
>> lda = XInteger.new(n.value)
>> vl = DReal.new
>> vu = DReal.new
>> il = XInteger.new
>> iu = XInteger.new
>> abstol = DReal.new(0.0)
>> m = XInteger.new
>> w = DMatrix.reserve(n.value,1)
>> v = DMatrix.reserve(n.value,n.value)
>> ldz = XInteger.new(n.value)
>> isuppz = IData.new(2*n.value)
>> lwork = XInteger.new(52)
>> work = DReal.new(lwork.value)
>> liwork = XInteger.new(20)
>> iwork = IData.new(liwork.value)
>> info = XInteger.new
>> Linalg::Lapack.dsyevr(jobz, range, uplo, n, a, lda, vl, vu, il, iu,
>> abstol, m, w, v, ldz, isuppz, work, lwork, iwork, liwork, info)
>>
>>
>> 現時点では、narray から DMatirx への変換が必要で、ループで値を代入するか、マーシャルダンプを利用するかです。
>> NArray#to_doublereal_ptr メソッドを作れば narray をそのまま使えると思います。
>>
>>
>>
>> これで Linalg版 dsyevr が実行できるはず、と思って実行してみたところ、
>> `dsyevr': too many arguments (21) (ArgumentError)
>> とのエラーが ^^;
>> ruby のソースを眺めてみると、なんと引数の最大値は15みたいです。
>>
>>
>>
>>
>> 2008/10/6 Takeshi Horinouchi <horinout@xxxxxxxxxxxxxxxxx>:
>> > 堀之内です。
>> >
>> > 西澤さん、すみません、「LAPACK や BLAS のラッパ」を探すのを忘れて
>> > ました。RAAで探したら次がでてきました。
>> > http://raa.ruby-lang.org/project/linalg/
>> > 見覚えがあるので、これでしょう。本体は、
>> > http://linalg.rubyforge.org/
>> > にあります。ちゃんとメンテされてるようです。
>> >
>> > NArrayは使わないようになってるんですかね。
>> > もしよければ、今回作ったのと仕様を比較して
>> > もらえませんか?
>> >
>> > # るびきちさんが作ってた気がするというのは
>> >   やはり勘違いだったようです。
>> >
>> > 皆様: 異動しました。(何度も目にしてる方すみません)
>> >
>> >> 西澤です
>> >>
>> >> Ruby-Lapack をリリースしました。
>> >> http://www.gfd-dennou.org/arch/ruby/products/ruby-lapack/index.html
>> >>
>> >> (ほぼ)すべてのサブルーチン、ファンクションをパックしてあります。
>> >> ただし、ほとんどテストしていませんので、いろいろ動かないものがあるかもしれません。
>> >>
>> >> 単なる1:1ラッパーであり、
>> >> 行列などのクラスを作ったりはしていません。
>> >> 行列はNArrayとして引数に与えます。
>> >>
>> >> 引数なしで呼び出すと、ヘルプメッセージがプリントされます。
>> >>
>> >>
>> >> --
>> >> Seiya Nishizawa
>> >> Department of Earth and Planetary Atmospheric Sciences, Kobe University
>> >
>> > 堀之内 武
>> > 北海道大学 地球環境科学研究院 地球圏科学部門
>> > 〒060-0810 札幌市北区北10条西5丁目
>> >
>> >
>> >
>>
>>
>>
>> --
>> Seiya Nishizawa
>> Department of Earth and Planetary Atmospheric Sciences, Kobe University
>
> 堀之内 武
> 北海道大学 地球環境科学研究院 地球圏科学部門
> 〒060-0810 札幌市北区北10条西5丁目
>
>
>



-- 
Seiya Nishizawa
Department of Earth and Planetary Atmospheric Sciences, Kobe University