インターフェース2011年12号にMATLABの特集があったので、Sageでoctaveを動かしてみようと思います。
sageでoctaveを使う場合には、Sageのサーバマシンにoctaveと必要なパッケージがインストールされている 必要があります。 「octaveのインストール」参照
sageからoctaveを使用する場合、あらかじめ以下の設定をすると便利です。
sageとoctaveがローカルのマシンにインストールされている場合には、GNUTERMの設定は不要です。 その場合には、sageでoctaveのプロットを行うとローカルの画面にプロット結果が表示されますので、 逐次確認を行いながらワークシートを作成することができます。
|
sageからoctaveの機能を呼び出すには、octave, octave.evalインターフェースを使用します。
'ans = 4' 'ans = 4' |
octaveの戻り値はOctaveElemntとして返されます。OctaveElementに対しては、 算術計算ができるためsageでのループ処理に利用できます。
また、sageで数値と扱うには、N関数を使って一度数値に変換して使用します。
<class 'sage.interfaces.octave.OctaveElement'> <type 'sage.rings.real_mpfr.RealNumber'> 4 12 <class 'sage.interfaces.octave.OctaveElement'> <type 'sage.rings.real_mpfr.RealNumber'> 4 12 |
octaveの使い方をコンパクトに説明したサイトが東海大学 稲葉研究室にあります。
|
octaveはMATLABのフリーのクローンであり、不完全ながらMATLABの関数と互換性があります。
sageの不得意とするデータ処理はoctaveの得意とするところであり、その豊富なライブラリと 行列計算の特徴を活かして、信号処理、画像処理、制御に多く使われています。
以下ではマトリックスAとBの演算をoctaveで行う場合の例を示します。 $$ A = \left[ \begin{array}{ccc} 1 & 2 & 3 \\ 3 & 4 & 5 \\ 7 & 8 & 9 \end{array} \right] $$ $$ B = \left[ \begin{array}{ccc} 4 & 2 & 4 \\ 5 & 6 & 7 \\ 7 & 8 & 9 \end{array} \right] $$
1 2 3 3 4 5 7 8 9 4 2 4 5 6 7 7 8 9 5 4 7 8 10 12 14 16 18 35 38 45 67 70 85 131 134 165 1 2 3 3 4 5 7 8 9 4 2 4 5 6 7 7 8 9 5 4 7 8 10 12 14 16 18 35 38 45 67 70 85 131 134 165 |
octaveのマトリックス計算では通常の計算の他に、行列の要素単位での演算を 行うために.(ピリオド)の後に演算子を指定する方法が提供されています。
かけ算*、左除算\、べき乗が^等を使うことができます。
$$ A .* B $$ の結果を以下に示します。
4 4 12 15 24 35 49 64 81 4 4 12 15 24 35 49 64 81 |
octave(MATLAB)の便利な特徴に左演算子\があります。
以下の様なベクトル計算でX=[a; b]としてXを求めるためにちょうど両辺を左からXで割る ような演算(左除算演算子)\を使うと、 $$ B = A X $$ から $$ A \verb|\| B = X $$ となり、Xを求めることができます。
例として以下の計算をoctaveで試してみましょう。結果は、X=[1; 1], A*X=[4, 5]となり, Bの値と一致します。 $$ \left[ \begin{array}{c} 4 \\ 5 \end{array} \right] = \left[ \begin{array}{cc} 3 & 1\\ 4 & 1 \end{array} \right] \left[ \begin{array}{c} a \\ b \end{array} \right] $$
1 1 4 5 1 1 4 5 |
左除算演算子\のすごいところは、そのまま最小自乗法で誤差を最小とするような解を計算してくれることです。
実験の結果、xの値[3; 4; 5]に対して観測値[4; 5; 6]が求まったとする。これを行列で表現すると、 $$ \left[ \begin{array}{c} 4 \\ 5 \\ 7 \end{array} \right] = \left[ \begin{array}{cc} 3 & 1\\ 4 & 1\\ 5 & 7 \end{array} \right] \left[ \begin{array}{c} a \\ b \end{array} \right] $$ となります。これからX= [a; b]を求めると以下の様になります。
1.5 -0.666667 3.83333 5.33333 6.83333 1.5 -0.666667 3.83333 5.33333 6.83333 |
先の計算で求められたX=[a; b]の値を使って、解の直線y = a*x +bとデータの点をプロットしてみます。
a, bに代入する場合には、N関数を使ってoctave要素から数値に変換します。そして、sageのプロット関数 を使えば簡単にベストフィッティングの解が求まったことが確認できます。
|
先の例では、octaveの結果(ベクトル)から要素を取り出し、sageで結果をプロットしましたが、 逆にsageのマトリックスをoctaveに渡すときには、octave.sage2octave_matrix_string を使用して、一端octaveのマトリックス表現文字列に変換します。
変換されたマトリックス表現文字列をoctaveに渡すことでsageからoctaveへのマトリックス 変換ができます。
[1, 2, 3; 4, 5, 6; 7, 8, 9] <class 'sage.interfaces.octave.OctaveElement'> 1 2 3 4 5 6 7 8 9 [1, 2, 3; 4, 5, 6; 7, 8, 9] <class 'sage.interfaces.octave.OctaveElement'> 1 2 3 4 5 6 7 8 9 |
octaveのプロット結果をsageのワークシートに表示するには、 一端png形式の画像ファイルに保存し、HTMLのimgタグを使って 画像を表示します。
こられの処理は冒頭ににありました、saveAndShowPlot関数を 呼び出すことで、簡単に行うことができます。
|
octaveには、信号処理や画像処理を行うためのライブラリが充実しており、 それらをsageから使うことによってsageの処理の幅が広がります。
画像処理の例として、lena_std.jpgの画像をグレイスケールに変換してみます。
|
|
|