Octave

西田顕郎, 2004/11/13


Octaveとは

Octaveは、オープンソース(無料)の数学解析ソフトです。この手のソフトは商用ではIDLとかMATLABが強いのですが、octaveはMATLABになるべく互換するように設計されています。

マニュアル

日本語マニュアル


インストール

Octaveは有名なソフトなので、ほとんどのLinuxディストリビューションが自動インストールに対応している。

Ubuntu 6.10, Vine 4.0の場合

$ sudo apt-get install octave

注意: ;を行末につけると、いちいち結果が表示されることがなくなる。

配列:

0から10まで、21段階の昇順配列を作る:
octave> x=linspace(0,10,21)'
三角関数を計算し、グラフをかく:
octave> y=sin(x)
octave> plot(x,y)
その他
行列aの2行3列要素: a(2,3)
行列aの1行目: a(1,:)
行列aの2列目: a(:,2)

x=linspace(-5,5,128)'
y=x
y(:)=0
y([58:71])=1
テキストファイルの読み込み:
テキストファイルの名前をhogehogeとすると、
octave> load hogehoge
で読み込みでき、内容はhogehogeという名前の変数に入る。ただし、hogehogeが既に変数として使われている場合はエラーが出るので、
octave> load -force hogehoge
とする。

バイナリの書き込み
	fp=fopen("test.raw", "w")
	count=fwrite(fp, data, "uchar")
	fclose (fp)
	

フーリエ変換 (FFT)

N=2^n個のデータが対象。f(0), f(1), f(2), ..., f(N-1)

結果もN個のデータになる。F(0), F(1), F(2), ..., F(N-1)

F(k)=f(0)e^(-ik*0*2π/N)+f(1)e^(-ik*1*2π/N)+f(2)e^(-ik*2*2π/N)+f(3)e^(-ik*3*2π/N)+...+f(N-1)e^(-ik*(N-1)*2π/N)

つまり、列ベクトル(f(0), f(1), f(2), ..., f(N-1))^tに、
N*N行列Q={e^(-ik*x*2π/N)}
   k=0, 1, 2, ..., N-1は行の添字; x=0, 1, 2, ..., N-1は列の添字
をかけたものが、(F(0), F(1), F(2), ..., F(N-1))^tになる。

Qは、定義から、明らかに対称行列(転置したら自分自身になる)。エルミート行列ではない。
e^(-ikxi*2π/N)の直交性から、Qはユニタリ行列に近い。(*QQは対角行列だが、対角成分は1ではなくてNになる)

振幅は、Nまたはsqrt(N)で割ってやる必要あり。逆変換と対称にしたいときはsqrt(N)で割る。

F(N/2)からF(N-1)までは、F(-N/2)からF(-1)と同じ。

画像処理

参考: 31. Image Processing (オンラインマニュアル)

# 画像ファイルの読み込み(準備)

Octaveは、Octaveオリジナルの画像ファイルフォーマットしかサポートしていない。しかし、このOctaveプログラムを使えば、少なくともアスキー形式のPPMフォーマットのファイルなら読み込むことができる。

そこで、上記のページから、

	## Copyright  ...
	...
	...
	endfunction
の部分をコピーし、loadimage2.mというファイル名で保存する。

# 画像ファイルの読み込み(実際)

いま、hogehoge.jpgというファイルを読み込みたいとする。まずxvで、これをアスキーPPM形式に変換する:

	$ xv hogehoge.jpg
	(画像が表示される)
	(画像を右クリック)
	(xv controlsというウィンドウが表れる)
	(その中の右のほうの、Saveというボタンを押す)
	(xv saveというウィンドウが表れる)
	(その中の右上のFormatのところをクリックし、PBM/PGM/PPM(ascii)を選ぶ)
	(で、xv controlsというウィンドウのOkボタンを押す)
	(すると、hogehoge.ppmというファイルができる)
Octaveを起動
	$ octave
	octave:1>
以下のコマンドで画像を読み込む:
	octave:2> [img, map]=loadimage2("hogehoge.ppm", "ppm")
	(データがずらっと表示されるが、qを押してプロンプトに戻る。)
ここで、imgというのが、hogehoge.ppmという画像ファイルのデータが入っている配列変数で、mapというのがそのカラーテーブルである。imgとmapは、適宜、てきとうな変数名に変えてよい。

# その他のコマンド:

	octave:3> imshow(img,map) ... 画像を表示

行列計算

参考: 福井大Naniwa氏のページ

  行列の定義
    octave: > M = [1, 2, 3; 4, 5, 6; 7, 9, 8]

  数学関数
    octave: > sin(M)
    octave: > sqrt(M)

  各列に対する演算
    octave: > mean(M)
    octave: > mean(M.')

  逆行列
    octave: > inv(M)
    octave: > inv(M)*M

  行列式
    octave: > det(M)

  転置
    octave: > M.'

  複素共役転置
    octave: > M'

  行列関数
    octave: > expm(M)
    octave: > logm(M)
    octave: > sqrtm(M)

  固有値と固有ベクトル
    octave: > [V, D] = eig(M)

    Vに固有ベクトルを列とする行列が返り,
    Dに固有値を対角成分に持つ行列が返る.

  ベクトルの生成
    octave: > v = 1:10
    octave: > v = 1:2:10
    octave: > v = linspace(1, 10, 5)

  行列の生成
    octave: > M = eye(3,3)
    octave: > M = diag([1, 2, 3])
    octave: > M = zeros(4,3)
    octave: > M = ones(3,4)
    octave: > M = rand(3,3)
    octave: > M = randn(3,3)

    rand は一様分布乱数を randn は正規分布乱数を成分にする行列を生成.