数値演算言語 Octave

[Back to UNIX] [Back to Akira Nishimura's Home Page]
hits since 1999/1/5

Last modified Saturday, 03-Jun-2006 08:00:59 JST


News!!

Octave CGI ProjectOctave を CGI として使 用するための関数集を公開しました。

Octaveユーザの日本語によるメーリングリスト発足!!
苣木(ちさき)さんのWEBページを御覧下さい。

Why Octave ?

あの高価な MATLAB とほぼ同等に使用できる数値演算言語です。さすがにMATLABにはかなわない (特に豊富な ToolBox やビジュアライゼーションには太刀打ちできない)面も 多いのですが、使いようによっては、MATLABより融通のきく非常に便利なソフ トウエアです。MATLABの m-file も、その多く(特にver.4.2時代のもの)は修 正なしで動いたりします。

私はMATLABのライセンスを複数アーキテクチャ分管理していますが、使い たいマシン全部に入れる訳にはいきません。しかし、Octave なら、GPL なの で、いくらでもインストールして使うことができます(使っています)。


Tips

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 としています。


Which is faster? MATLAB and Octave

速さが命!! シミュレーション用途などでガリガリ計算させたいが、そのプ ログラミングには手間を掛けたくない人には、Octave のような数値演算言語 はうってつけです。では、Octave と MATLAB どっちが計算速度が速いのか? 売り物であるMATLABの方が断然速いようにも思われますが、私の経験からは一 概にそうも言えないようです。同じコードでも Octave が速い場合もあります。


To be FAST!!

Octave と MATLAB に共通して言える高速化の手法は、for 文を書くな!! です。

組み込み関数を使って 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文をなくす例

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 による場合 分けを無くす、などのテクニックもあります。


More FAST!!

MATCOM(Matlab,Octaveコンパイラ)を使う(工事中)

ATLASをリンクする

詳しくは千葉さんのページ ATLASによるOctaveの高速化参照

とりあえず結果だけ。Pentium2-450MHz(Deschutes), Octave-2.0.16において、

実行例1

a=rand(1000,1000);b=rand(1000,1000);
t=time();c=a*b;time()-t
を実行。デフォルトでは 74sec, ATLASを組み込むと 52sec でした。Alphaほ ど劇的に速くなんない。Mendocinoで最適化したせいなのか?

実行例2

a = randn(1000000, 1);
tic, b = fft(a); toc
の場合、デフォルトでは 38sec, ATLASを組み込むと 35sec、うーむ、、、しゃー ないか。


Links

My Original Works

Octave CGI ProjectOctave を CGI として使用するための関数集

English

Japanese

MATLAB

その他


Download

i386(glibc2.1: RedHat-6.x, Vine-2.x)用

i386用パッケージに必須なlibf2c

i386(glibc2: RedHat-5.x, Vine-1.x, TLJ-3.x)用

LinuxPPC(R4)用

ソース


And...

Octaveの将来についての議論がアツイ...help-octaveメーリングリ スト(英語)参照。はたしてJWEは次期安定化バージョンの完成と共に本当に手 を引いてしまうのか!?
akira@rsch.tuis.ac.jp