ScalaNLP/Breeze入門 2


ScalaNLP/Breezeの使い方の第2回です。

ScalaNLP/Breezeが何かとか、インストール方法などについては第1回をご覧下さい。

Breezeを用いた行列とベクトルの復習

簡単な例として、2行2列の例で説明しましょう。

オブジェクトの生成

breezeでは下記のような(密)ベクトル

\( \displaystyle x = \left( \begin{array}{c} 1 \\ 2 \end{array} \right) , \; y = \left( \begin{array}{c} 3 \\ 4 \end{array} \right) \)

と書く事が出来ます。

下記のような(密)行列

\( \displaystyle A = \left(\begin{array}{cc}
2 & 3 \\
1 & 2
\end{array}\right), \;
B = \left( \begin{array}{cc} 3 & 4 \\ 2 & 3 \end{array}\right)\)

を定義するには、行ベクトル(横ベクトル)を縦に並べて表現します。

加減算、積など

行列の加減算は通常の +, - といった演算子が使用出来ます。また行列の積も * で計算出来ます。

\( \displaystyle
x+y = \left( \begin{array}{c} 4 \\ 6 \end{array}\right), \;
A+B = \left( \begin{array}{cc} 5 & 7 \\ 3 & 5 \end{array}\right), \;
AB = \left( \begin{array}{cc} 12 & 17 \\ 7 & 10 \end{array}\right), \;
Ax = \left( \begin{array}{c} 8 \\ 5 \end{array}\right)
\)
は、

となります。

要素の取得、スライス

行列 \(A\) の要素を取り出したり、その部分(slice)を取り出す事も出来ます。行列 \(A\) をa で表すならば、\(A_{ij}\) は a(i,j) で表現されます。但し数学と違って添字が1-originではなく0-originであることに注意する必要があります。要素やスライスを取得する例は下記の様になります。(ここだけ判り易い様に3行3列の行列を使ってます)

各行や各列のsliceを作るには別の記法もあります。こちらの方が判り易いかもしれません。

mutable object

行列やベクトルは、メモリ使用量や効率を考えmutable objectとして作成されます。従って要素を変更可能です。またsliceは元のobjectを参照しているので下記の様にzの変更を通じてcが変更されます。また*=の様な自分自身を更新する演算子も多数用意されています。

逆行列

逆行列などを計算するにはDouble型の行列である必要があります。

\( \displaystyle A = \left(\begin{array}{cc}
2 & 3 \\
1 & 2
\end{array}\right), \;
B = \left(\begin{array}{cc}
3 & 4 \\
2 & 3
\end{array}\right),
\;x = \left(\begin{array}{c}
1 \\
2
\end{array}\right)
\)

を下記の様に定義します。

\(A\) の逆行列 \(A^{-1}\) はinv(a)で計算出来ますが、\(A^{-1}B, \; A^{-1}x\) と逆行列を用いて計算したいだけの場合は、a \ b, a \ x\ という演算子を用いて逆行列を計算しない事が推奨されています。

\( \displaystyle A^{-1} = \left(\begin{array}{cc}
2 & -3 \\
-1 & 2
\end{array}\right), \;
A^{-1}x = \left(\begin{array}{c}
-4 \\
3 \end{array}\right), \;
A^{-1}B = \left(\begin{array}{cc}
0 & -1 \\
1 & 2
\end{array}\right)
\)
は下記の様になります。