Last modified Saturday, 03-Jun-2006 08:00:59 JST
Octave CGI ProjectOctave を CGI として使 用するための関数集を公開しました。
Octaveユーザの日本語によるメーリングリスト発足!!
苣木(ちさき)さんのWEBページを御覧下さい。
あの高価な MATLAB とほぼ同等に使用できる数値演算言語です。さすがにMATLABにはかなわない (特に豊富な ToolBox やビジュアライゼーションには太刀打ちできない)面も 多いのですが、使いようによっては、MATLABより融通のきく非常に便利なソフ トウエアです。MATLABの m-file も、その多く(特にver.4.2時代のもの)は修 正なしで動いたりします。
私はMATLABのライセンスを複数アーキテクチャ分管理していますが、使い たいマシン全部に入れる訳にはいきません。しかし、Octave なら、GPL なの で、いくらでもインストールして使うことができます(使っています)。
MATLABと同等に使うためには、Octave のオンラインマニュアルを読めば分 かりますが、脳死(?)モードなるMATLAB互換モードでOctaveをまずは起動して みましょう。
% octave --braindead Octave, version 2.0.13 (i586-pc-linux-gnulibc1). Copyright (C) 1996, 1997, 1998 John W. Eaton. This is free software with ABSOLUTELY NO WARRANTY. For details, type `warranty'. >>
おお、MATLABと似たインタフェースが起動しましたね!!
Octave のオンラインマニュアルより
`--braindead' Set initial values for user-preference variables to the following values for compatibility with MATLAB. PS1 = ">> " PS2 = "" beep_on_error = 1 default_save_format = "mat-binary" define_all_return_values = 1 do_fortran_indexing = 1 empty_list_elements_ok = 1 implicit_str_to_num_ok = 1 ok_to_lose_imaginary_part = 1 page_screen_output = 0 prefer_column_vectors = 0 print_empty_dimensions = 0 treat_neg_dim_as_zero = 1 warn_function_name_clash = 0 whitespace_in_literal_matrix = "traditional"
このような設定を $HOME/.octaverc に書いておけば、毎回 octave --braindead しなくても大丈夫です。ちなみに私は、PS1 だけをセットせずに、 Octave としてのアイデンティティをわずかながら保っています(^^;)
後は、MATLABにはあるが、Octaveに無くて困る関数を自分で作ってやれば、 OctaveはMATLABと同じように使える訳です。そこで、、、
ここで、比較対象のMATLAB は version 5.x としています。
速さが命!! シミュレーション用途などでガリガリ計算させたいが、そのプ ログラミングには手間を掛けたくない人には、Octave のような数値演算言語 はうってつけです。では、Octave と MATLAB どっちが計算速度が速いのか? 売り物であるMATLABの方が断然速いようにも思われますが、私の経験からは一 概にそうも言えないようです。同じコードでも Octave が速い場合もあります。
Octave と MATLAB に共通して言える高速化の手法は、for 文を書くな!! です。
n = 1; wns = randn(100000, 1); for k=1:length(wns) if wns(k) > a idx(n) = k; n = n+1; end endのコードを、
wns = randn(100000, 1); idx = find(wns > a);
と書き直せば格段に速くなります。
for t=1:1000 sig(t) = sin(2*pi*100*t/sf); endを、
t = 1:1000; sig = sin(2*pi*100*t/sf);とします。もちっと高度な例は、
f = 100:10:2000; t = (1:1000)/sf; for k=1:length(f) sig(k,:) = sin(2*pi*f(k)*t); endを、
f = 100:10:2000; ff = ones(length(f), 1).*f'; t = (1:1000)/sf; sig = sin(2*pi*t*ff*t);です。(M x 1) x (1 x N) = (M x N) 行列計算の公式を思い出しましょう:-)。 ちなみに、この例では、約 length(f)倍メモリを多く使用するので、メモリが 少ない場合は HDDへのスワップガリガリでチョー遅くなる場合もあるので、要 注意。
他にも、これらの複合技として、sign 関数を使って for & if による場合 分けを無くす、などのテクニックもあります。
とりあえず結果だけ。Pentium2-450MHz(Deschutes), Octave-2.0.16において、
a=rand(1000,1000);b=rand(1000,1000); t=time();c=a*b;time()-tを実行。デフォルトでは 74sec, ATLASを組み込むと 52sec でした。Alphaほ ど劇的に速くなんない。Mendocinoで最適化したせいなのか?
a = randn(1000000, 1); tic, b = fft(a); tocの場合、デフォルトでは 38sec, ATLASを組み込むと 35sec、うーむ、、、しゃー ないか。
MIDEVA という MATLAB 5.2 互換のソフトや、MATCOMというMATLABコンパイラを扱って いました。MATCOMのUnix版は、無料でした。しか〜し、最近 MATLAB の開発 元である MathWorks社に買収され てしまいました。
i386用パッケージに必須なlibf2c