Yabu.log

ITなどの雑記

Octaveの基本的な使い方

機械学習のプロトタイプを作るのはOctaveが効率的らしい。 RやPythonなどを使う人もいるが、入門者が学習目的で学びながら作成したり、 プロトタイプを作るのにはOctaveが一番効率的、とのこと*1

基本的な演算

加減乗除

%はコメントです。

5+6 % 加
3-2 % 減
5*8 % 乗
1/2 % 除
2^6 % 冪

比較

1 == 2 % eq
1 ~= 2 % not eq

論理演算

1 && 0   % AND
1 || 0   % OR
xor(1,0) % XOR

画面表示にまつわるTips

  • コンソールの表示を変える
octave:1> PS1(">>");
>>

これで下記の例だと一行目のアプリ名が省略されシンプルになる。*2

  • セミコロン(;)を文末に加えることで代入じの画面表示を抑制
>> a = 3
a = 3
>> a =3; %次の行の出力で何も表示されない
>>            
  • フォーマット文字列
octave:2> disp(sprintf('pi is: %0.2f',pi))
pi is: 3.14
octave:3> disp(sprintf('pi is: %0.5f',pi))
pi is: 3.14159

formatコマンドで通常時の出力の形式を指定することも可能

octave:10> pi
ans =  3.14159265358979
octave:11> format short
octave:12> e
ans =  2.7183

行列・ベクトル

列はスペース区切り、行はセミコロン(;)で分割

octave:13> [1 2; 3 4; 5 6]
ans =

   1   2
   3   4
   5   6

便利な生成方法

繰り返しによる指定

>> v = 1:0.1:2 % 開始:増分:終了
v =

    1.0000    1.1000    1.2000    1.3000    1.4000    1.5000    1.6000    1.7000    1.8000    1.9000    2.0000

各要素が1または0の行列作成

もちろん列数を1とすることでベクトルも生成可能

>>ones(5,2) %ones(行数,列数)
ans =

   1   1
   1   1
   1   1
   1   1
   1   1
>>zeros(4,5)
ans =

  0   0   0   0   0
  0   0   0   0   0
  0   0   0   0   0
  0   0   0   0   0

各要素が乱数になる生成

>>rand(3,3)
ans =

   0.73882   0.56016   0.60064
   0.11604   0.50570   0.85379
   0.39978   0.77641   0.19745

>>rand(3,3) %乱数なので毎度結果が異なる
ans =

   0.89295   0.34303   0.34988
   0.56998   0.35830   0.72597
   0.94476   0.56983   0.84483

正規分布

>>randn(3)
ans =

  -1.432169  -0.156601  -1.509394
  -0.015477  -0.704944   0.749234
  -0.653065   0.098928  -0.296580

ヒストグラム

>>w = rand(1,1000);
>>hist(w,100)

行列・ベクトルのサイズ

size(m)   % 行数 列数の1*2の行列を返す
length(v) % 行列の長さのうち長い方を返す

どちらも行列、ベクトル双方に利用可能だが、混乱の元になるので 行列にはsizeを配列にはlengthを利用するのが良い。

ワークスペースにある変数の操作

どのような変数があるか調べる

>>who
Variables in the current scope:

a    ans  v    w
>>whos %型まで表示する
Variables in the current scope:

   Attr Name        Size                     Bytes  Class
   ==== ====        ====                     =====  =====
        a           1x4                         32  double
        ans         1x1                          1  logical
        v           1x11                        24  double
        w           1x1000                    8000  double

Total is 1016 elements using 8057 bytes

変数を消す

>>clear a % clear <消す変数(指定がなければ全部削除)>
>>who
Variables in the current scope:

ans  v    w

>>clear
>>who
>>

ファイル操作

ファイルに保存する

>>save matrix.mat m; % save <保存ファイル名> <保存する値>
>>ls
matrix.mat

vim で保存したが、読めないことはない。

# Created by Octave 4.2.1, Fri Jan 19 13:01:52 2018 JST <俺の個人情報>
# name: m
# type: matrix
# rows: 3
# columns: 2
 1 2
 3 4
 100 200

ASCIIのTEXTとして保存する

save matrix.text   -ascii % acii形式で保存する

vim で開いてみた なんか有効数字的なのがついてる

1.00000000e+00 2.00000000e+00
3.00000000e+00 4.00000000e+00
1.00000000e+02 2.00000000e+02

保存したファイルを開く

load matrix.matで保存したデータを読み込める

>>who
>>load matrix.mat
>>who
Variables in the current scope:

m

データ操作

A = [1 2; 3 4; 5 6]

indexで行列の要素を指定する

A_32に当たる

>>A(3,2)
ans =  6
>>A(2,:) % 二行目全て
ans =

   3   4
>>A(:,2) %2列目全て
ans =

   2
   4
   6
>>A([1 3],:) % 1、3行目全て
ans =

   1   2
   5   6

indexで代入する

>>A(3,2) = 100
A =

     1     2
     3     4
     5   100
>>A(:,2) = [10;11;12] %2列目に代入
A =

    1   10
    3   11
    5   12
>>A = [A,[100;200;300]] % ベクトルを連結
A =

     1    10   100
     3    11   200
     5    12   300

小ネタ

行列の要素を全て連結してベクトルを作る

>>A(:)
ans =

     1
     3
     5
    10
    11
    12
   100
   200
   300

行列の連結

A = [1 2;3 4;5 6] B = [11 12; 13 14; 15 16]

横に連結

>>C = [A B]
C =

    1    2   11   12
    3    4   13   14
    5    6   15   16

縦に連結

>>C = [A;B]
C =

    1    2
    3    4
    5    6
   11   12
   13   14
   15   16

*1:RやPythonは規模の大きな開発になって初めて検討するのが良い、とのこと

*2:Macならデフォルトのもので気にならないが、Windowだと.exeまで表示され画面表示が煩わしいので有効かと