From: NISHIMATSU Takeshi Date: 2002-08-12T19:48:57+09:00 Subject: [ruby-list:35743] FortranArray, yet another handler of array 西松と申します. Fortran型の配列をRubyで扱うための拡張ライブラリとして FortranArrayと名付けたものを書きはじめました. 下に README-jp.rd を添付しました. tar-ballを http://www-lab.imr.tohoku.ac.jp/~t-nissie/computer/software/FortranArray/README-jp.html http://www-lab.imr.tohoku.ac.jp/~t-nissie/computer/software/FortranArray/FortranArray-0.00.23.tar.gz に置きました. % ls -l FortranArray-0.00.23.tar.gz -rw-r--r-- 1 t-nissie kawazoe 22014 Aug 12 19:30 FortranArray-0.00.23.tar.gz % md5sum FortranArray-0.00.23.tar.gz 52838c8f68354e4edf4c62da46007dec FortranArray-0.00.23.tar.gz まだ実装していない機能が多いのですが, このままぼく一人 で書き進むのがちょっと不安なので, 皆様のご意見, 感想, 誤りの指摘などをいただければ幸いです. よろしくお願いし ます. =begin = README before using Ruby/FortranArray (Japanese version) Ruby/FortranArrayはFortran型の配列をRubyで扱うための 拡張ライブラリです. == Ruby/FortranArrayの特徴 * 要素は倍精度実数または倍精度複素数に限定 (@kind = 'D' or 'Z'). * メモリに要素がFortranと同じ順序で並ぶ. * デフォルトでインデックスが1から始まる. * 要素のアクセス方法 (例: 二次元配列 mat_A[i,j]) は Fortran (A(i,j)) や 数学の行列の添字 (A_{ij}) と同じ. * Rangeを使ってインデックスの範囲を任意に指定可能. 0や負の値から始める こともできる. * 自然な部分配列の参照 (手抜きともいう). * 部分配列の参照方法のせいでコストはかかるが mat_A[j][i] という 要素のアクセスも可能. * BLAS (dgemv, gemv, symv, zsymvのみ実装済), LAPACK (未実装) への自然な インタフェース. * BLAS, LAPACK の Matrix type (@matrix_type = 'GE', 'SY', 'HE', 'TR', 'GB', 'SB', 'HB', 'TB', 'SP', 'HP', 'TP'), UPLO (@uplo = 'UPPER' or 'LOWER'), DIAG (@diag = 'NON-UNIT' or 'UNIT'), band width (@band_width, @band_width_u) を属性として持つので, あるメソッドから呼ばれる BLAS, LAPACK のサブルーチンがある程度自動的に選択される. * FFT. 数種のOSに付属の科学計算ライブラリの FFT subroutine を共通の メソッドでラップ (未実装). * Rubyで高速な数値計算が可能. * logical dimension (ld) を指定できるので, 基数2のアルゴリズムで 発生しがちなキャッシュミス, バンクコンフリクト等による低速化を 回避できる (アホくさいけどかなり切実). * Matrix type や ld は一度指定してしまえば忘れることができる. * RubyUnitで書かれたtestcaseを使ってTestをしながら開発が可能. == Ruby/FortranArrayの欠点かもしれないこと * +,-,*,/,%,** 等の演算子を定義していない. == NArrayとの比較 NArray ((<[NArray]>)) はRubyの拡張ライブラリで, 強力な多次元((*数値*))配列クラス を提供している. 西松はNArrayのソースコードを見ながらFortranArrayを書いた. NArrayとFortranArrayとを比較すると: * NArrayは 1,2,4 byte 整数, 単/倍 精度 実数/複素数, およびRubyオブジェクトを 要素に持つことができる. FortranArrayは倍精度実数または倍精度複素数のみ. * NArrayのインデックスは常に0から始まる. FortranArrayは任意. * NArrayではNArrayのサブクラスとして行列 (NMatrix), ベクトル (NVector) が 定義されている. FortranArrayでは特に区別しない. * 数学の行列: A_{ij} → NArray: mat_A[j-1, i-1], FortranArray: mat_A[i,j] (であっていると思う). * NArrayには強力な部分配列機能がある. FortranArrayのは手抜き. == 入手方法 Please download a tar-ball from: (()) == インストール方法 $ ruby install.rb config $ ruby install.rb setup # ruby install.rb install == テストして動作を確認したOS :GNU/Linux Turbolinux 6.0 Workstation, ruby 1.6.6 (2001-12-26) [i686-linux], FortranArray-0.00.23 :sgi IRIX64 IRIX 6.5, ruby 1.6.7 (2002-03-01) [mips-irix6.5], FortranArray-0.00.23 :IBM AIX AIX+ESSL, ruby 1.6.6 (2001-12-26) [powerpc-aix4.3.3.0], FortranArray-0.00.23 == 作者 西松 毅 (()) == 書いた日 2002,08,12 == FortranArrayクラスメソッド --- FortranArray.new(ndim,range[0], ... , range[ndim-1],ld[0], ... , ld[ndim-1],kind='D', matrix_type='GE', uplo='UP', diag='NON-UNIT', band_width, band_width_u) 新しいFortranArrayを作る. :ndim 配列の次元. :range[i] 範囲. 整数 n が指定された場合は 1..n と等価. :ld[i] logical dimension. 整数 n が指定された場合は 1..n と等価. 省略時は ld[i]==range[i] になる. :kind 'D' - double precision (default value) 'Z' - complex double :matrix_type 'GE', 'SY', 'HE', 'TR', 'GB', 'SB', 'HB', 'TB', 'SP', 'HP', 'TP' :uplo 'UPPER' - upper triangular (はじめの2文字だけを見るので'UP'と省略可) 'LOWER' - lower triangular (はじめの2文字だけを見るので'LO'と省略可) general matrix のときは意味を持たない. :diag 'NON-UNIT' - NOT unit triangular matrix 'UNIT' - unit triangular matrix triangular matrix のときにのみ意味を持つ. :band_width 整数で指定できるldと区別するためにband_widthを指定する場合は その前に必ず文字列の引数を置くこと. matrix_type が 'GB' (General Band) のときはlowerのband_width. :band_width_u upperのband_width. matrix_type が 'GB' (General Band) のとき指定. == FortranArrayインスタンスメソッド: --- FortranArray#ndim @ndim の reader. --- FortranArray#range @range の reader. --- FortranArray#ld @ld の reader. --- FortranArray#kind @kind の reader. 'D' か 'Z' のどちらかを返す. --- FortranArray#matrix_type @matrix_type の reader. 'GE', 'SY', 'HE', 'TR', 'GB', 'SB', 'HB', 'TB', 'SP', 'HP', 'TP' のどれかを返す. --- FortranArray#uplo @uplo の reader. 'UPPER' か 'LOWER' のどちらかを返す. --- FortranArray#set_all(x) 配列の要素すべてを x にする. x は倍精度実数か倍精度複素数に変換されて用いられる. @rangeの中の要素だけでなく, @ldの中の要素すべてが x になる (その方がコーディングが楽だったから) . --- FortranArray#[] reference or partial array. @ndimより少ない数のFixnumのインデックスで指定した部分配列は 「親の配列」の要素をそのまま参照している. そのため, この部分 配列を書き換えると「親の配列」も変わる. Partial array assigned by Ranges is not implemented yet. こっちはクローンを作る予定. --- FortranArray#[]= 代入. @kind='Z' な FortranArray に Float, Fixnum, Bignum などを代入 することは可能. 虚部は0になる. @kind='D' な FortranArray に Complex を代入しようとすると TypeError になる. --- FortranArray#set_all(all_value) --- FortranArray#data(val1, val2, ...) 各要素に val1, val2, ... を代入. --- FortranArray#to_s(with_attr=TRUE, format, fd) FortranArrayをFortran風に書き出す. 第一引数がFALSEの場合は属性 (@ndim, @range, @ld, @kind, @matrix_type, @uplo, @diag, @band_width, @band_width_u) を書かない. formatが指定されたらそれが用いられる. fd が指定されたならそこに書き出す (未実装). FortranArrayがデカくてStringのためのメモリ領域を確保できない ときなどに使う. こfd が指定された時の戻り値は不定????? --- FortranArray#clone (未実装) --- FortranArray#gemv(mat_A, x, alpha=(1.0, 0.0), beta=(0.0, 0.0), trans='N', incx=1, incy=1, m = mat_A.range[0].length, n = mat_A.range[1].length, lda = mat_A.ld[0].length) incx, incy の方が m, n, lda より設定する機会が多そうだから前にした. BLASのdgemvまたはzgemvを呼ぶ. --- FortranArray#symv(mat_A, x, alpha=(1.0, 0.0), beta=(0.0, 0.0), uplo=mat_A.uplo, incx=1, incy=1, n = mat_A.range[0].length, lda = mat_A.ld[0].length) BLASのdsymvまたはzsymvを呼ぶ. == 参考文献 :[NArray] Masahiro TANAKA: ((<"NArray"|URL:http://www.ir.isas.ac.jp/~masa/ruby/>)) :[BLAS] (()) :[LAPACK] (()) =end -- love && peace && free_software NISHIMATSU Takeshi t-nissie@imr.edu OR t-nissie@imr.tohoku.ac.jp 西松 毅