LoginSignup
67
89

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-04-22

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 代入式

67
89
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
67
89