Octave のデータ型,種々の基本的な演算,乱数,ベクトルや行列についての各種の演算(固有値,固有ベクトル,逆行列,行列式など)について説明する.
【目次】
Octave のデータ型は行列だけである. このページでは,適宜,行ベクトル,列ベクトル,スカラーという言葉を次の意味で扱う.
Octave では,変数の大文字と小文字を区別するので注意. このページでは,行ベクトルと列ベクトルとスカラーが入る変数は小文字,一般の行列は大文字にしている.
【要点】
行ベクトルは、1行m列の行列 (m>=1).
変数 t に,要素 2, 1, 3 の行ベクトル(要素がこの順で並ぶ)を格納したいときは,
t = [2 1 3]
x = [1 2 3 4 5 6]
「zeros(1, m)」のように書く.m は列数.
x = zeros(1, 10)
「ones(1, m)」のように書く.m は列数.
x = ones(1, 10)
「zeros(1, m) + x」のように書く.m は列数.
x = zeros(1, 10) + 5
「rand(1, m)」のように書く.m は列数.
x = rand(1, 10)
「randn(1, m)」のように書く.m は列数.
x = randn(1, 10)
初項,公差,末項を「:」で区切る.
x = [3:2:9]
※ 「x = 3:2:9」と書いても同じ意味.
あるいは,初項,末項を「:」で区切る.このときは,公差=1.
x = [2:4]
※ 「x = 2:4」と書いても同じ意味.
初項,末項,項数を指定.グラフを作るときなどに便利
x = linspace(1,500,20)
対数グラフにしたときに等間隔になるような数列を生成.
x = logspace(1,500,20)
要素番号を使っての参照.
x = [1 2 3 4 5 6] x(1)
要素番号が入った行ベクトル(あるいは列ベクトル)を使っての参照
x = [10 20 30 40 50 60] x([2 4 6]) x(1:3) x(1:2:5)
要素番号を使っての代入
x = [1 2 3 4 5 6] x(2) = 20
要素番号が入った行ベクトル(あるいは列ベクトル)を使っての代入
x = [1 2 3 4 5 6] x([3 4 5]) = [20 30 40]
x = [1 2 3] y = [4 5 6] [x y]
x = [1 2 3 4 5 6] x(2) = [] y = [1 2 3 4 5 6] y([3 4 5]) = []
x = [1 2 3 4 5 6] class(x)
x = [1 2 3 4 5 6] size(x)
「.'」を使った転置
x = [1 2 3 4 5 6] x.'
「'」を使った転置は,複素共役転置
x = [1 2 3 4 5 6] x'
x = [1 2 3 4 5 6] x + 10
※ 要素単位の演算は,この Web ページの下の方に,別立てで書いています.
x = [1 2 3 4 5 6] x * 3
x = [1 2 3 4 5 6] 3 ./ x
a = [1 2 3 2 2 5] a == 1
sort は,デフォルトでは,昇順 (increasing order) でのソート. ソート順を明示的に指定したいときは, 「sort(a,ascent)」, 「sort(a,descend)」 のように書く.
x = [1 2 3] y = [4 5 6] x*y'
【要点】
変数 t に,要素 2, 1, 3 の列ベクトル(要素がこの順で並ぶ)を格納したいときは,
t = [2; 1; 3]
【要点】
変数 M に,要素 1, 2, 3, 4 が入った2行2列の行列,つまり,
1 3 2 4
を格納したいときは,次のように書く.
M = [1 3; 2 4]
行を「;」で区切る
A = [1 2 3; 4 5 6]
「zeros(n,m)」のように書く.n は行数,m は列数.
A = zeros(3,4)
「ones(n,m)」のように書く.n は行数,m は列数.
A = ones(3,4)
「zeros(n,m) + x」のように書く.n は行数,m は列数.
A = zeros(3,4) + 5
「eye(n)」のように書く.n は行数(であり列数でもある).単位行列は正方行列(行数と列数が等しい行列)
A = eye(3)
diag を使う.引数に指定したベクトルを対角要素に持つ行列が作られる.
A = diag([1 2 3 4])
「rand(N, M)」のように書く.N は行数,M は列数.
x = rand(3, 4)
「randn(N, M)」のように書く.N は行数,M は列数.
x = randn(3, 4)
「reshape(v, n, m)」のように書く.n は行数,m は列数.
例えば,x 座標値が並んだベクトル [0 1 2 3] と y 座標値が並んだベクトル [1 2 3] からメッシュグリッドを生成するのは次の通り.
[XX, YY] = meshgrid([0 1 2 3], [1 2 3])
(例)meshgrid の使用例. mesh 関数を用いた表示
x = [0 1 2 3]; y = [1 2 3]; [XX, YY] = meshgrid(x, y); ZZ = XX.*YY; mesh(XX, YY, ZZ); close;
(例)meshgrid の使用例. contour 関数を用いた表示
x = [0 1 2 3]; y = [1 2 3]; [XX, YY] = meshgrid(x, y); ZZ = XX.*YY; contour(XX, YY, ZZ); close;
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(1,1) A(3,2)
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(1:2, 2:4) A(1:2, 2) A(1:2, :)
A(1:2,[2 4])
X = [1 102; 1 102; 2 101; 3 101; 3 103] X(:,1) == 3 X( X(:,1) == 3, : )
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(2,3) = 60 A
同じ列数の列ベクトルや,行列の連結.下の例では A の後に「;」が来ることに注意.
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] B = [A; [13 14 15 16]] C = [A; [13 14 15 16; 17 18 19 20]]
同じ行数の行ベクトルや,行列の連結. 下の例で分かるように,半角の空白文字で区切って,連結したい行列や行ベクトルを並べる.
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] B = [A [100; 101; 102]] C = [A [100 200; 101 201; 102 202]]
行方向に連結するときは「;」を使う
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] D = [13 14 15 16; 17 18 19 20] [A; D]
列方向に連結するときは、半角の空白文字を使う
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] E = [20 21; 22 23; 24 25] [A E]
[] を使う
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A([1 3],:) = [] A
[] を使う
A = [1 2 3 4; 5 6 7 8; 9 10 11 12] A(:,[1 3]) = [] A
ベクトルのときは 1. 行列のときは 2 (のはず).
縦横のサイズはそれぞれ:
size(mat, 1) size(mat, 2)
「.'」を使った転置
「'」を使った転置は,複素共役転置
x = [1 2 3 4 5 6] x'
※ 要素単位の演算は,この Web ページの下の方に,別立てで書いています.
※ 要素単位の演算は,この Web ページの下の方に,別立てで書いています.
X = [1 2 3; 2 3 2; 2 2 3] X == 2
A\y は,行列 A とベクトル y から,Ax = y の解 x を求める. A\Y は,行列 A と Y から,A*X = Y の解 X を求める.
右除算は,左除算を使って定義されている. A/Y = (Y'\A')' である. つまり,A/Y は,行列 A と Y から,X*A = Y の解 X を求める.
行列の固有値 (eigenvalue) と固有ベクトル (eigenvectors) を求める. 最初にヘッセンベルグ分解 (Hassenberg decomposition) の関数 hess が使われ,次にシューア分解 (Schur decomposition) の関数 schur が使われる.
固有ベクトルは,行列Vの列ベクトル.固有値は,行列LAMBDAの対角要素. A * X = X * LABMDA が成り立つ.
sum(diag(X)) を求める
X = [1 2 3; 4 5 6; 7 8 9] trace(X)
X = [1 2 3; 4 5 6; 7 8 9] [U, S, V] = svd(X)
LAPACK の機能を使い,LU 分解を行う.例えば次のように書く.
0 でない特異値の数
X = [1 2 3; 4 5 6; 7 8 9] rank(X)
X = [1 2 3; 4 5 6; 7 8 9] [Q, R, P] = qr(X)
X = [11 12 13; 14 15 16; 19 18 17] cov(X)
X = [1 2 3; 4 5 6; 7 8 9] B = [1 2; 3 4] Z = conv2(X, B, 'full')
Octave では,スカラーに対する演算は,行列やベクトル(行ベクトルと列ベクトル)にも使えることに注意. このとき,行列やベクトルの要素単位での演算が行われる. 2項演算は,同じサイズの行列やベクトル同士に使える.
atans(Y, X) は,(Y / X) に対して,逆タンジェントを求める.
論理演算では,値が 0 ならば偽 (FALSE), 値が 0 以外ならば真 (TRUE) とみなされる. 比較の結果,真なら 1,偽なら 0.
行列やベクトルの場合には,要素ごとに比較を行う. 比較の結果,真なら 1,偽なら 0.
(例)集約演算の例
x = [1 2 3 4 5 6] max(x) min(x) mean(x) sum(x) length(x)
度数分布のヒストグラムのデータを得たい(グラフのプロットはしない)場合には histcを使う.データサイズが大きいとき速い.
(例)ヒストグラムのプロットの例(帯の中央値は [-4 -3 -2 -1 0 1 2 3])
v = randn(1,2000); hist( v, [-4 -3 -2 -1 0 1 2 3] ) close
pkg load optim
pkg load optim (未確認)
2つのベクトルのコンボリューション
2つの行列のコンボリューション
フィルタ
plot( filter(1, [1 0.9], [1 zeros(1,99)') )
ローパス, ハイパス, バンドパス, バンドストップの FIR フィルタ