octaveを使う機会があったので、使ったものはまとめておきます。
octaveは下記のWikipediaの引用にあるように、数値解析を目的とした高レベルプログラミング言語です。
今回使うに至ったのはまさに「線形ならびに非線形問題を数値的に解くため」です。
また、数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路 にあるように機械学習の勉強でも使うみたいですね。
GNU Octave は、主に数値解析を目的とした高レベルプログラミング言語である。Octaveは線形ならびに非線形問題を数値的に解くためのコマンドライン·インタフェースを提供する。また、 MATLABとほぼ互換性のある、数値実験を行うためのプログラミング言語として使用することができる。 Octaveは、GNUプロジェクトの一つでGNU General Public Licenseの条件の下のフリーソフトウェアである。 GNU OctaveとScilabは、MATLABのオープンソース代替品の一つである。 ただし、Octaveは、ScilabよりもMATLABとの互換性維持に重点を置いている。(引用: Wikipedia https://ja.wikipedia.org/wiki/GNU_Octave)
チュートリアルがあったのでやってみるといいかもしれません。
Octave Programming Tutorial
ドキュメント。やっぱりドキュメント見たほうがよさそう。
GNU Octave docs
Macにoctaveを入れるためにはhomebrewを使って
brew install octave
としました。
基本
コメントアウト
# シャープでその行をコメントアウト出来る
ファイル実行
ファイル実行は
$ octave
で起動した後に、そのディレクトリにあるファイル名で実行可能。
octave > file_name
で実行出来る。
ただし、ファイル名は file_name.m
標準入力からのデータの受け取り
A = input('Enter matrix A');
# => Enter matrix A
# 入力待ちになる。値を入れると Aに値が入る。
標準出力
octaveは基本的に計算結果を出力する。
「;」を行末につけると出力されなくなる。
デバックのときは「;」をとる。
A = [1 2 3;4 5 6]
# => A =
# 1 2 3
# 4 5 6
A = [1 2 3;4 5 6]
# 出力されない
行列の扱い
行列の表し方
# 行
A = [1 2 3]
# =>
# A =
# 1 2 3
# 列
A = [1;2;3]
# =>
# A =
# 1
# 2
# 3
# 行列
A = [1 2 3;4 5 6;7 8 9]
# =>
# A =
# 1 2 3
# 4 5 6
# 7 8 9
# 転置行列
A.'
# =>
# A.' =
# 1 4 7
# 2 5 8
# 3 6 9
行列の一部を取得
A = [1 2 3;4 5 6;7 8 9]
A(2, 3)
# 2行3列目
# =>
# ans = 6
A([1, 3], [2, 3])
# 1, 3行目で2, 3列目
# =>
# ans =
# 2 3
# 8 9
A(2, :)
# 「:」は全部を表す 2行目の全部
# =>
# ans =
# 4 5 6
行列への代入、削除
A = [1 2 3;4 5 6;7 8 9]
A(1, 2) = 1
# 1行2列を1にする
# =>
# A =
# 1 1 3
# 4 5 6
# 7 8 9
A(:, 2) = 5
# 2列のすべてを5にする
# =>
# A =
# 1 5 3
# 4 5 6
# 7 5 9
A(3, :) = []
# 3行目をすべて削除(行の削除)
# =>
# A =
# 1 5 3
# 4 5 6
行列の行数・列数
A = [1 2 3;4 5 6]
# 行数
size(A, 1)
# => ans = 2
# 列数
size(A, 2)
# => ans = 3
文法
for文
for i=1:5
i
endfor
# =>
# j = 1
# j = 2
# j = 3
# j = 4
# j = 5
continue
for文を一回とばす
break
for文を終了する
if文
if(i == 0 && j == 0)
k
elseif i = 1
j
else
i
endif
Cell Array
多段階配列的なのが使いたかったのですが、それが実装出来たのがこれです。
cell_array = { 1, 2, { 3, 4, {5} } }
cell_array{1}
# => ans = 1
cell_array{3}{3}{1}
# => ans = 5
cell_array{1} = 3
cell_array{1}
# => ans = 3
式評価
isempty
値が空か空出ないかのbool値で返してくれる。
findと組み合わせて、配列の中に値が含まれるかチェックに使うと便利だった。
X = [2 3 4]
isempty(find(X == 2))
# => true
計算処理
conbination
nchoosek([1:5], 3)
# ans =
# 1 2 3
# 1 2 4
# 1 2 5
# 1 3 4
# 1 3 5
# 1 4 5
# 2 3 4
# 2 3 5
# 2 4 5
# 3 4 5
連立一次方程式
# x + 2y = 3, 2x + 5y = 4 の解
A = [1 2; 2 5]
b = [3;4]
A\b # 解を返す
関数
引数あり、返り値返す
関数を作成するときは関数ごとに別々のファイルを用意する。ファイル名は 関数名.m
。同じディレクトリにあれば関数名で関数を実行出来る。
function y = given_function (x) # 返り値 = 関数名 (引数)
if (0 < x && x < 1)
y = 1/x + exp(x);
else
y = 0;
endif
endfunction
エラー解決
List index out of bounds
List index out of bounds
index指定の間違い。
hoge[2]とかしてて、そのキーの値がないとき。
参考
Function for 'does matrix contain value X?'
Octave の使い方その3 数値解析
Octaveやってみる! 順列
10.6 代入式