Octave 基本的なところをまとめておく

octaveを使う機会があったので、使ったものはまとめておきます。
octaveは下記のWikipediaの引用にあるように、数値解析を目的とした高レベルプログラミング言語です。
今回使うに至ったのはまさに「線形ならびに非線形問題を数値的に解くため」です。

また、[数学を避けてきた社会人プログラマが機械学習の勉強を始める際の最短経路](http://qiita.com/daxanya1/items/218f2e3b922142550ef9) にあるように機械学習の勉強でも使うみたいですね。

> 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](https://en.wikibooks.org/wiki/Octave_Programming_Tutorial)

ドキュメント。やっぱりドキュメント見たほうがよさそう。
[GNU Octave docs](https://www.gnu.org/software/octave/doc/v4.0.1/)

Macにoctaveを入れるためにはhomebrewを使って

```
brew install octave
```

としました。

# 基本

## コメントアウト

```octave
# シャープでその行をコメントアウト出来る
```

## ファイル実行
ファイル実行は

```
$ octave
```

で起動した後に、そのディレクトリにあるファイル名で実行可能。

```
octave > file_name
```

で実行出来る。
ただし、ファイル名は file_name.m

## 標準入力からのデータの受け取り

```octave
A = input('Enter matrix A');
# => Enter matrix A
# 入力待ちになる。値を入れると Aに値が入る。
```

## 標準出力

octaveは基本的に計算結果を出力する。
「;」を行末につけると出力されなくなる。
デバックのときは「;」をとる。

```octave
A = [1 2 3;4 5 6]
# => A =
#    1   2   3
#    4   5   6
A = [1 2 3;4 5 6]
# 出力されない
```



# 行列の扱い

## 行列の表し方

```octave
# 行
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
```

## 行列の一部を取得

```octave
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
```

## 行列への代入、削除

```octave
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


```

## 行列の行数・列数

```octave
A = [1 2 3;4 5 6]
# 行数
size(A, 1)
# => ans = 2
# 列数
size(A, 2)
# => ans = 3
```

# 文法
## for文

```octave
for i=1:5
  i
endfor

# =>
# j =  1
# j =  2
# j =  3
# j =  4
# j =  5
```

### continue
for文を一回とばす

### break
for文を終了する

## if文

```octave
  if(i == 0 && j == 0)
    k
  elseif i = 1
    j
  else
    i
  endif
```

# Cell Array

多段階配列的なのが使いたかったのですが、それが実装出来たのがこれです。

```octave
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と組み合わせて、配列の中に値が含まれるかチェックに使うと便利だった。

```octave
X = [2 3 4]
isempty(find(X == 2))
# => true
```

# 計算処理
## conbination

```octave
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
```

## 連立一次方程式

```octave
# x + 2y = 3, 2x + 5y = 4 の解
A = [1 2; 2 5]
b = [3;4]
A\b # 解を返す
```

# 関数

## 引数あり、返り値返す

関数を作成するときは関数ごとに別々のファイルを用意する。ファイル名は ```関数名.m```。同じディレクトリにあれば関数名で関数を実行出来る。

```octave
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?'](http://stackoverflow.com/questions/1913670/function-for-does-matrix-contain-value-x)
[Octave の使い方その３ 数値解析](http://www.rbt.his.u-fukui.ac.jp/~naniwa/pub/octv3.html)
[Octaveやってみる！ 順列](http://octave.dogrow.net/?p=427)
[10.6 代入式](http://www.obihiro.ac.jp/~suzukim/masuda/octave/html/octave_48.html)