2017年8月29日火曜日

行列式

 2x2行列が \begin{equation}  A = \begin{pmatrix} a & c \\ b & d \end{pmatrix} \end{equation} ならば、その行列式は、 \begin{equation} a d - b c \end{equation} となります。行列の逆行列を求めるとき、成分を行列式の値で割る計算が入りますから、行列式の計算は重要です。行列式は英語でdeterminantといい、行列\(A\)の行列式は\( \det A \)と書きます。\( |A| \)とも書きます。例えば、2x2の行列が \begin{equation} B = \begin{pmatrix} 3 & 2 \\ 4 & 5 \end{pmatrix} \end{equation} なら、その行列式は\( \det B = 3 \cdot 5 - 2 \cdot 4 = 7 \) となります。
 行列式は計算負荷が高いので、求めやすい形に変形します。このとき使われるのが、以下の行列式の計算法則です。ここでは6つ挙げていますが、逆行列の計算には(1),(2),(5)が主に用いられます。

(1) \( \det B = k \det A \)
 ただし、行列\(B\)は、行列\(A\)の1行の成分を\(k\)倍したものです。例えば、 \begin{equation} A = \begin{pmatrix} a & c \\ b & d \end{pmatrix} \\ B = \begin{pmatrix} a & c \\ k b & k d \end{pmatrix} \end{equation} なら、 \begin{equation} \det A = a d - b c \\ \det B = k a d - k b c = k ( a d - b c ) = k \det A \end{equation} です。

(2) \( \det B = - \det A \)
 ただし、行列\(B\)は、行列\(A\)の1行の成分と別の1行の成分とを入れ替えたものです。例えば、 \begin{equation} A = \begin{pmatrix} a & c \\ b & d \end{pmatrix} \\ B = \begin{pmatrix} b & d \\ a & c \end{pmatrix} \end{equation} なら、 \begin{equation} \det A = a d - b c \\ \det B = b c - a d = - ( a d - b c ) = - \det A \end{equation} です。

(3) \( \det A = 0 \)
 ただし、行列\(A\)の1行の成分と別の1行の成分とが等しいものです。例えば、 \begin{equation} A = \begin{pmatrix} a & c \\ a & c \end{pmatrix} \end{equation} なら、 \begin{equation} \det A = a c - a c = 0 \end{equation} です。

(4) \( \det C = \det A + \det B \)
 ただし、行列\(A, B, C\)ではそれぞれ1行の成分以外、すべて等しいという条件で、その1行について\(A\)の成分と\(B\)の成分の和が\(C\)の成分に等しくなっています。例えば、 \begin{equation} A = \begin{pmatrix} a & c \\ b & d \end{pmatrix} \\ B = \begin{pmatrix} a & c \\ t & v \end{pmatrix} \\ C = \begin{pmatrix} a & c \\ b + t & d + v \end{pmatrix} \end{equation} なら、 \begin{equation} \det A + \det B = ( a d - b c ) + ( a v - c t ) = a ( d + v ) - c ( b + t ) = \det C \end{equation} です。

(5) \( \det B = \det A \)
 ただし、行列\(B\)は、行列\(A\)の1行の成分に、別の1行の成分の定数倍を足したものです。例えば、 \begin{equation} A = \begin{pmatrix} a & c \\ b & d \end{pmatrix} \\ B = \begin{pmatrix} a & c \\ b + k a & d + k c \end{pmatrix} \end{equation} なら、 \begin{equation} \det B = a ( d + k c ) - c ( b + k a ) = a d - b c + k ( a c - a c ) = a d - b c = \det A \end{equation} です。

(6) \( \det A^T = \det A \)
 これは、転置をとっても行列式の値は変わらないことを示しています。例えば、 \begin{equation} A = \begin{pmatrix} a & c \\ b & d \end{pmatrix} \\ A^T = \begin{pmatrix} a & b \\ c & d \end{pmatrix} \end{equation} なら、 \begin{equation} \det A^T = a d - b c = \det A \end{equation} です。

 ここでは2x2行列の場合を扱いましたが、3x3行列、4x4以上の行列でも同様の性質が成り立ちます。

2017年8月22日火曜日

対称行列

 対称行列というのは、右下斜めの対角線に対して成分が対称になっている行列です。例えば、 \begin{equation} A = \begin{pmatrix} a & b \\ b & d \end{pmatrix} \end{equation} とかです。転置の記号を使うと、 \begin{equation} A = A^T \end{equation} と表せます。転置行列の計算には気を付けることがあります。 \begin{equation} (AB)^T = B^T A^T \end{equation} となって、順序が入れ替わることに注意します。
 対称行列のメリットは、対称行列の固有値に対する固有ベクトルが直交するということです。例えば、対称行列 \begin{equation} A = \begin{pmatrix} 2 & 1 \\ 1 & 4 \end{pmatrix} \end{equation} の対角化を考えます。行列式は \begin{equation} \det ( A - \lambda E ) = \det \left \{ \begin{pmatrix} 2 & 2 \\ 2 & 5 \end{pmatrix} - \lambda \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \right \} = \det \begin{pmatrix} 2 - \lambda & 2 \\ 2 & 5- \lambda \end{pmatrix} \\ = ( 2 - \lambda )(5 - \lambda) - 2 \cdot 2 = \lambda^2 - 7 \lambda + 6 = ( \lambda - 1 )( \lambda - 6 ) \end{equation} となり、固有値は\( \lambda = 1, 6 \)と求まります。
 固有ベクトルを\( \begin{pmatrix} x & y \end{pmatrix}^T \)とすれば、連立方程式は \begin{equation} \begin{pmatrix} 2 - \lambda & 2 \\ 2 & 5- \lambda \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \end{pmatrix} \end{equation} となります。\( \lambda = 1\)のとき、\( x + 2 y = 0 \)ですから、 \begin{equation} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 2 \\ -1 \end{pmatrix} \end{equation} となります。\( \lambda = 6\)のとき、\( 2 x - y = 0 \)ですから、 \begin{equation} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 1 \\ 2 \end{pmatrix} \end{equation} となります。これらの固有ベクトルの内積を計算すると、0になりますから、確かに直交しています。
 固有ベクトルは定数倍してもよいですから、大きさが1になるようにとります。大きさが1になるということは、単位ベクトルということです。これは正規直交基底そのもので、三次元ならば以下の図のように表されます。

 対称行列のメリットは、基底の取替え行列が正規直交基底となり、計算が簡単になることです。 \begin{eqnarray} \vec{e}_1 \cdot \vec{e}_1 = 1, \ \ \vec{e}_2 \cdot \vec{e}_2 = 1, \ \ \vec{e}_3 \cdot \vec{e}_3 & = & 1 \\ \vec{e}_1 \cdot \vec{e}_2 = 0, \ \ \vec{e}_2 \cdot \vec{e}_3 = 0, \ \ \vec{e}_3 \cdot \vec{e}_1 & = & 0 \end{eqnarray}  もう一つのメリットは、逆行列の計算が簡単になることです。行列\(A\)が表す一次変換を、基底の取替え行列\(P\)として正規直交基底(固有ベクトル)を並べて作った行列で表せますから、逆行列は転置行列と同等になります。 \begin{equation} P^{-1} = P^T \end{equation}

2017年8月15日火曜日

対角化の導出

 前回、対角化をやりました。その定義と意味、具体例は述べましたが、なぜそうなるかは示しませんでした。今回はそれを示します。
 行列\(A\)は\(n \times n\)の正方行列だとして、その固有値を\(\lambda_1, \lambda_2, \cdots , \lambda_n\)、これに対する固有ベクトルを\(\vec{x_1}, \vec{x_2}, \cdots , \vec{x_n}\)としますと、次式が成り立ちます。 \begin{equation} A \vec{x_1} = \lambda_1 \vec{x_1} \\ A \vec{x_2} = \lambda_2 \vec{x_2} \\ \cdots \\ A \vec{x_n} = \lambda_n \vec{x_n} \end{equation} 固有ベクトルを並べた行列\(P = \begin{pmatrix} \vec{x_1} & \vec{x_2} & \cdots & \vec{x_n} \end{pmatrix}\)を作ると、 \begin{equation} A P = \begin{pmatrix} \lambda_1 \vec{x_1} & \lambda_2 \vec{x_2} & \cdots & \lambda_n \vec{x_n} \end{pmatrix} = P \left( \begin{array}{ccccc} \lambda_1&0&0&\cdots &0\\ 0&\lambda_2&0&\cdots &0\\ 0&0&\lambda_3&\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n \end{array} \right) \end{equation} となります。ここで、列ベクトルごとに\(\lambda\)をかける次式を使っています。 \begin{equation} \left( \begin{array}{rrcr} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{array} \right) \left( \begin{array}{ccccc} \lambda_1&0&0&\cdots &0\\ 0&\lambda_2&0&\cdots &0\\ 0&0&\lambda_3&\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n \end{array} \right) = \left( \begin{array}{rrcr} \lambda_1 a_{11} & \lambda_2 a_{12} & \cdots & \lambda_n a_{1n} \\ \lambda_1 a_{21} & \lambda_2 a_{22} & \cdots & \lambda_n a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ \lambda_1 a_{n1} & \lambda_2 a_{n2} & \cdots & \lambda_n a_{nn} \end{array} \right) \end{equation} 行列\(P\)が逆行列を持てば、先の式の両辺に左から\(P^{-1}\)をかけて \begin{equation} P^{-1}AP = \left( \begin{array}{ccccc} \lambda_1&0&0&\cdots &0\\ 0&\lambda_2&0&\cdots &0\\ 0&0&\lambda_3&\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n \end{array} \right) \end{equation} を得ます。

2017年8月8日火曜日

対角化

 正方行列\(A\)に対して、固有ベクトルを並べた正方行列\(P\)を取ると、対角行列は\(P^{-1}AP\)のように求められます。この操作は対角化と呼ばれます。対角行列というのは、正方行列の右斜め下方向の対角成分だけを持つ行列です。 \begin{equation} P^{-1}AP = \left( \begin{array}{ccccc} \lambda_1&0&0&\cdots &0\\ 0&\lambda_2&0&\cdots &0\\ 0&0&\lambda_3&\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n \end{array} \right) \end{equation} ここで、\(\lambda_1, \lambda_2, \cdots , \lambda_n\)は正方行列\(A\)の固有値になります。正方行列\(A\)が行と列にそれぞれ\(n\)個ずつの成分を持てば、\(n\)次正方行列と言います。 \begin{equation} A = \left( \begin{array}{rrcr} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{n1} & a_{n2} & \cdots & a_{nn} \end{array} \right) \end{equation} また、\(P\)は、正方行列\(A\)の固有値に対応する固有ベクトルを並べたものです。固有ベクトルを\(\vec{x_1}, \vec{x_2}, \cdots , \vec{x_n}\)とおけば、対角化の操作に使われる正方行列\(P\)は \begin{equation} P = \begin{pmatrix} \vec{x_1} & \vec{x_2} & \cdots & \vec{x_n} \end{pmatrix} \end{equation} となります。
 対角行列を具体的に求める前に、対角化の意味とメリットを考えてみましょう。\(P^{-1}AP\)という行列表現は、新しい基底を座標系とした場合の線形変換を表しました。ただし、新しい基底は固有ベクトルの組になっていて、線形変換の行列表現は対角行列になっています。対角化操作を表す式を\(m\)乗すると、 \begin{equation} ( P^{-1}AP )^m = \left( \begin{array}{ccccc} \lambda_1&0&0&\cdots &0\\ 0&\lambda_2&0&\cdots &0\\ 0&0&\lambda_3&\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n \end{array} \right)^m \end{equation} となります。左辺は、 \begin{equation} ( P^{-1}AP ) ( P^{-1}AP ) \cdots ( P^{-1}AP ) = P^{-1}A^mP \end{equation} となります。対角行列を\(m\)回かけた行列は対角成分をそれぞれ\(m\)乗したものになりますから、右辺は \begin{equation} \left( \begin{array}{ccccc} \lambda_1^m &0&0&\cdots &0\\ 0&\lambda_2^m &0&\cdots &0\\ 0&0&\lambda_3^m &\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n^m \end{array} \right) \end{equation} となります。つまり、 \begin{equation} P^{-1}A^mP = \left( \begin{array}{ccccc} \lambda_1^m &0&0&\cdots &0\\ 0&\lambda_2^m &0&\cdots &0\\ 0&0&\lambda_3^m &\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n^m \end{array} \right) \end{equation} です。ここで、両辺の左から\(P\)を、右から\(P^{-1}\)をかけると、 \begin{equation} A^m = P \left( \begin{array}{ccccc} \lambda_1^m &0&0&\cdots &0\\ 0&\lambda_2^m &0&\cdots &0\\ 0&0&\lambda_3^m &\cdots &0\\ &\vdots&&\ddots&\\ 0&0&0&\cdots &\lambda_n^m \end{array} \right) P^{-1} \end{equation} となります。したがって、行列の\(m\)乗の計算を単純にできるのです。
 では、行列の対角化を具体的に行ってみましょう。正方行列\(A\)を \begin{equation} A = \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} \end{equation} とします。前の回で固有値と固有ベクトルは求めました。それを使えば、固有ベクトルを並べた行列 \(P = \begin{pmatrix} 1 & 5 \\ -1 & 4 \end{pmatrix} \) に対して \begin{equation} P^{-1}AP = \begin{pmatrix} -2 & 0 \\ 0 & 7 \end{pmatrix} \end{equation} となります。固有値と固有ベクトルは対応する順番に並べることに注意します。

2017年8月1日火曜日

固有値と固有ベクトル

 線形変換の表現行列が\(A\)のとき、座標\((x, y)\)は、\((x', y')\)に移されます。このとき、元の座標値を定数倍する組合せが存在します。例えば、 \begin{equation} A = \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} \end{equation} でしたら、座標\((2, 1)\)は、\((11, 10)\)に移されます。もし、座標\((2, 1)\)を原点からのベクトル\(\begin{pmatrix} 2 \\ 1 \end{pmatrix}\)と考えますと、そのベクトルは線形変換によって大きさも方向も異なるベクトル\(\begin{pmatrix} 11 \\ 10 \end{pmatrix}\)に移されます。図に描けば、以下のようになます。

このとき、ベクトルを\(\begin{pmatrix} 5 \\ 4 \end{pmatrix}\)のようにとりますと、\(\begin{pmatrix} 35 \\ 28 \end{pmatrix}\)に移されます。これは、元のベクトルと方向は同じで、大きさが定数倍(7倍)になっています。つまり、次式が成り立ちます。 \begin{equation} A \begin{pmatrix} x \\ y \end{pmatrix} = \lambda \begin{pmatrix} x \\ y \end{pmatrix} \end{equation} \(\lambda\)を固有値、\(\begin{pmatrix} x & y \end{pmatrix}^T\)を固有ベクトルと言います。どうしてこのようになるかは、この後の回の「対角化」の説明を見ていただくとして、ここでは、\(2\times2\)行列\(A\)の固有値、固有ベクトルを求めてみましょう。上記の式から、次式が成り立ちます。 \begin{equation} A \begin{pmatrix} x \\ y \end{pmatrix} = \lambda \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} \\ \begin{pmatrix} 3 - \lambda & 5 \\ 4 & 2 - \lambda \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \end{pmatrix} \end{equation} この式がベクトル\( \begin{pmatrix} x \\ y \end{pmatrix} \neq \begin{pmatrix} 0 \\ 0 \end{pmatrix} \)を持つ条件は、次式で与えられます。 \begin{equation} \det \begin{pmatrix} 3 - \lambda & 5 \\ 4 & 2 - \lambda \end{pmatrix} = 0 \end{equation} したがって \begin{equation} (3 - \lambda) (2 - \lambda) - 20 = \lambda^2 -5 \lambda -14 = 0 \end{equation} これを解くと、\(\lambda = -2, 7\)です。固有値が\(\lambda = -2\)のとき、固有ベクトルは\( \begin{pmatrix} 1 \\ -1 \end{pmatrix} \)となります。固有値が\(\lambda = 7\)のとき、固有ベクトルは\( \begin{pmatrix} 5 \\ 4 \end{pmatrix} \)となります。

2017年7月25日火曜日

基底の変換

先の線形変換では、座標\((x, y)\)を変えずに、基底の変換を行いました。今度は、座標系の位置はそのままで、基底を変換したらどうなるか考えてみましょう。 まず、\( \vec{a} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \)、\( \vec{b} = \begin{pmatrix} 5 \\ 2 \end{pmatrix} \)としますと、この基底の下での座標\((2, 1)\)は、 \begin{equation} 2 \vec{a} + 1 \vec{b} = 2 \begin{pmatrix} 3 \\ 4 \end{pmatrix} + \begin{pmatrix} 5 \\ 2 \end{pmatrix} = \begin{pmatrix} 11 \\ 10 \end{pmatrix} \end{equation} となります。この座標ベクトル\( \begin{pmatrix} 11 \\ 10 \end{pmatrix} \)は、標準基底\(\vec{e_1},\vec{e_2}\)では \begin{equation} \begin{pmatrix} 11 \\ 10 \end{pmatrix} = 11 \begin{pmatrix} 1 \\ 0 \end{pmatrix} + 10 \begin{pmatrix} 0 \\ 1 \end{pmatrix} = 11 \vec{e_1} + 10 \vec{e_2} \end{equation} と表されます。

 ここで、基底\(\vec{a},\vec{b}\)自体を、標準基底\(\vec{e_1},\vec{e_2}\)で表しますと、 \begin{equation} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = z_1 \begin{pmatrix} 1 \\ 0 \end{pmatrix} + z_2 \begin{pmatrix} 0 \\ 1 \end{pmatrix} \\ \begin{pmatrix} 5 \\ 2 \end{pmatrix} = z_3 \begin{pmatrix} 1 \\ 0 \end{pmatrix} + z_4 \begin{pmatrix} 0 \\ 1 \end{pmatrix} \end{equation} となりますから、\( z_1 = 3, z_2 = 4, z_3 = 5, z_4 = 2 \)です。これを、行列で表しますと、 \begin{equation} \begin{pmatrix} 3 \\ 4 \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \begin{pmatrix} 3 \\ 4 \end{pmatrix} \\ \begin{pmatrix} 5 \\ 2 \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \begin{pmatrix} 5 \\ 2 \end{pmatrix} \end{equation} となります。さらに列ベクトルを横に並べれば、 \begin{equation} \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} = \begin{pmatrix} 1 & 0 \\ 0 & 1 \end{pmatrix} \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} \end{equation} となります。ここで右辺の右側の行列を \( A = \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} \) とおきますと、 \begin{equation} \begin{pmatrix} \vec{a} & \vec{b} \end{pmatrix} = \begin{pmatrix} \vec{e_1} & \vec{e_2} \end{pmatrix} A \end{equation} です。

 さて、基底\(\vec{a},\vec{b}\)の下での座標\((2, 1)\)は与えられていましたが、本来未知です。そこで、この座標を\((i, j)\)とおきますと、この座標ベクトルは、\( i \vec{a} + j \vec{b} \)と表されます。この式は、\( \begin{pmatrix} \vec{a} & \vec{b} \end{pmatrix} \begin{pmatrix} i \\ j \end{pmatrix} \) とも表され、\( 11 \vec{e_1} + 10 \vec{e_2} \) は \( \begin{pmatrix} \vec{e_1} & \vec{e_2} \end{pmatrix} \begin{pmatrix} 11 \\ 10 \end{pmatrix} \) とも表されますから、標準基底 \(\vec{e_1},\vec{e_2}\) での座標ベクトル \( \begin{pmatrix} 11 \\ 10 \end{pmatrix} \)は、 \begin{equation} \begin{pmatrix} 11 \\ 10 \end{pmatrix} = \begin{pmatrix} \vec{e_1} & \vec{e_2} \end{pmatrix} \begin{pmatrix} 11 \\ 10 \end{pmatrix} = \begin{pmatrix} \vec{a} & \vec{b} \end{pmatrix} \begin{pmatrix} i \\ j \end{pmatrix} = \begin{pmatrix} \vec{e_1} & \vec{e_2} \end{pmatrix} A \begin{pmatrix} i \\ j \end{pmatrix} \end{equation} となります。したがって、 \begin{equation} \begin{pmatrix} 11 \\ 10 \end{pmatrix} = A \begin{pmatrix} i \\ j \end{pmatrix} \end{equation} を得ます。\( \begin{pmatrix} i \\ j \end{pmatrix} \) を求めるには、左から \( A \) の逆行列をかけます。 \begin{equation} \begin{pmatrix} i \\ j \end{pmatrix} = A^{-1} \begin{pmatrix} 11 \\ 10 \end{pmatrix} \end{equation} \( A = \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} \)ですから、 \( A^{-1} = \begin{pmatrix} \frac{-1}{7} & \frac{5}{14} \\ \frac{2}{7} & \frac{-3}{14} \end{pmatrix} \)です。したがって、 \begin{equation} \begin{pmatrix} i \\ j \end{pmatrix} = \begin{pmatrix} 2 \\ 1 \end{pmatrix} \end{equation} を得ます。ここまで標準基底 \(\vec{e_1},\vec{e_2}\) を考えてきましたが、一般の基底 \(\vec{c},\vec{d}\) に置き換えても構いません。つまり、基底を次のように変換する変換行列 \( A \) があったとして、 \begin{equation} \begin{pmatrix} \vec{a} & \vec{b} \end{pmatrix} = \begin{pmatrix} \vec{c} & \vec{d} \end{pmatrix} A \end{equation} 基底 \(\vec{c},\vec{d}\) の下での座標 \(\begin{pmatrix} k \\ l \end{pmatrix}\) から基底 \(\vec{a},\vec{b}\) の下での座標 \(\begin{pmatrix} i \\ j \end{pmatrix}\) を求めるには、 \begin{equation} \begin{pmatrix} i \\ j \end{pmatrix} = A^{-1} \begin{pmatrix} k \\ l \end{pmatrix} \end{equation} です。

2017年7月18日火曜日

線形変換

座標\((2, 1)\)を原点からのベクトル\(\begin{pmatrix} 2 \\ 1 \end{pmatrix}\)と考えれば、 \begin{equation} \begin{pmatrix} 11 \\ 10 \end{pmatrix} = \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} \begin{pmatrix} 2 \\ 1 \end{pmatrix} \end{equation} となります。これは、線形変換\(f\)の表現行列が \begin{equation} A = \begin{pmatrix} 3 & 5 \\ 4 & 2 \end{pmatrix} \end{equation} であるとき、\(f\)によって座標\((2, 1)\)が\((11, 10)\)に移されると考えることができます。図に描けば、以下のようになります。

標準基底を\(\vec{e}_x = \begin{pmatrix} 1 \\ 0 \end{pmatrix} \)、\(\vec{e}_y = \begin{pmatrix} 0 \\ 1 \end{pmatrix} \)にとりますと、座標\((x, y)\)は、 \begin{equation} \begin{pmatrix} x \\ y \end{pmatrix} = x \begin{pmatrix} 1 \\ 0 \end{pmatrix} + y \begin{pmatrix} 0 \\ 1 \end{pmatrix} = x \vec{e}_x + y \vec{e}_y \end{equation} と表せます。これに線形変換\(f\)を施せば、 \begin{equation} f(x \vec{e}_x + y \vec{e}_y) = x f(\vec{e}_x) + y f(\vec{e}_y) = x \begin{pmatrix} 3 \\ 4 \end{pmatrix} + y \begin{pmatrix} 5 \\ 2 \end{pmatrix} \end{equation} となります。ここで、\( \vec{a} = \begin{pmatrix} 3 \\ 4 \end{pmatrix} \)、\( \vec{b} = \begin{pmatrix} 5 \\ 2 \end{pmatrix} \)としますと、 \begin{equation} \begin{pmatrix} x^\prime \\ y^\prime \end{pmatrix} = x \vec{a} + y \vec{b} \end{equation} を得ます。\( \vec{a} \)、\( \vec{b} \)を基底と考えると、\( \begin{pmatrix} x^\prime \\ y^\prime \end{pmatrix} \)は、\( \vec{a} \)、\( \vec{b} \)が張る座標系上の座標\((x, y)\)となります。図に描けば、以下のようになります。

つまり、線形変換\(f\)は、標準基底で\( x \vec{e}_x + y \vec{e}_y \)と表される座標を、基底\( \vec{a} \)、\( \vec{b} \)で\( x \vec{a} + y \vec{b} \)と表される座標に移す変換と考えることができます。別の言い方をすれば、標準基底の直交座標系での座標\((x, y)\)を、基底\( \vec{a} \)、\( \vec{b} \)が張る座標系での座標\((x, y)\)に移す変換ということができます。

2017年3月23日木曜日

CentOS7にcuDNNをインストール

(参照http://qiita.com/skanai/items/0f0a9bdd7e04d55db981)
cuDNNは、Deep Neural NetworkをGPUで高速化するためのライブラリである。NVIDIAが提供する。インストール作業は手間じゃないけど、cuDNNをダウンロードするとき、NVIDIAのサイトでログインする必要がある(アカウントのない人は登録する)。

https://developer.nvidia.com/cudnn

ダウンロードしたディレクトリで解凍する。
$ tar xvfz cudnn-8.0-linux-x64-v5.1.tgz

解凍された一連のファイルを、CUDAをインストールしたディレクトリにコピーする。
$ cd cuda
$ sudo cp -a lib64/libcudnn* /usr/local/cuda/lib64/
$ sudo cp -a include/* /usr/local/cuda/include/
$ sudo ldconfig

2017年3月15日水曜日

CentOS7にCUDAをインストール

深層学習を行うとき、処理時間がかかります。そこで、GPUを使って処理の高速化を図ります。主要なGPUメーカはNVIDIAですが、そのNVIDIAはCUDAという並列処理用プログラミング統合環境を提供しています。ここでは、NVIDIA GeForce GTX 670が組み込まれたマシンのCentOS7に、CUDAを導入します。
(参照:http://qiita.com/dyoshiha/items/5214d1076f92c9c4646f)

$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 670] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GK104 HDMI Audio Controller (rev a1)
03:00.0 VGA compatible controller: NVIDIA Corporation GK104 [GeForce GTX 670] (rev a1)
03:00.1 Audio device: NVIDIA Corporation GK104 HDMI Audio Controller (rev a1)

カーネルのバージョンを確認します。
$ uname -r
3.10.0-514.10.2.el7.x86_64

GCCのバージョンを確認します。
$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-11)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

kernelと同じversionのkernel-developmentとkernel-headersが必要とのこと。両パッケージをインストールします。

$ sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
 
$ yum list installed | grep kernel
abrt-addon-kerneloops.x86_64           2.1.11-45.el7.centos            @base   
kernel.x86_64                          3.10.0-514.10.2.el7             @updates
kernel-devel.x86_64                    3.10.0-514.10.2.el7             @updates
kernel-headers.x86_64                  3.10.0-514.10.2.el7             @updates
kernel-tools.x86_64                    3.10.0-514.10.2.el7             @updates
kernel-tools-libs.x86_64               3.10.0-514.10.2.el7             @updates

cuda_8.0.44_linux.runをダウンロードします。
$ wget https://developer.nvidia.com/compute/cuda/8.0/prod/local_installers/cuda_8.0.44_linux-run

通常、NVIDIAのビデオカード用ドライバNouveauが導入されています。これを無効化した後、ランレベルを下げてからインストールします。

Nouveauの無効化
$ sudo vi /etc/modprobe.d/blacklist-nouveau.conf
として、以下を書き込みます。
blacklist nouveau
options nouveau modeset=0


文字入力のときは、"i"を入力してから文字を打ちこみます。
ファイルを保存して終了するときは、"Esc"キーを押しながら、":"キーを押します。その上で、"wq"と打ちこみます。これで、blacklist-nouveau.confというファイルの中に上記内容が書き込まれました。

$ cat /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0

ここで一回、再起動します。

以下のコマンドで、ランレベルを下げます。
$ systemctl set-default multi-user.target

CUDAをインストールします。
$ sudo sh cuda_8.0.44_linux.run

ランレベルを戻します。
$ systemctl set-default graphical.target

再起動します。
$ sudu reboot

PATHの設定を追加します。.bash_profileに以下を追加します。

CUDA_ROOT_DIR="/usr/local/cuda-8.0"
export CUDA_ROOT_DIR
PATH=$PATH:${CUDA_ROOT_DIR}/bin
export PATH
LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${CUDA_ROOT_DIR}/lib64/
export LD_LIBRARY_PATH

上記編集を加たら、以下のコマンドで有効にします。
$ source .bash_profile

CUDAのサンプルプログラムをコンパイルし、実行して、CUDAがインストールされていることを確認します。まず、freeglutをインストールします。
$ sudo yum install freeglut freeglut-devel
$ cd ~/NVIDIA_CUDA-8.0_Samples/
$ make
$ bin/x86_64/linux/release/deviceQuery
これで、GPUの情報を取得できればOKのはずです。


2017年3月8日水曜日

CentOS7にOpenCVをインストール

CentOS7にOpenCVをインストールします。
(http://qiita.com/twaka/items/7555785aea11879d6718を参照)

カーネルのバージョンを確認
$ uname -r
3.10.0-514.10.2.el7.x86_64
 
ビルドに必要なものをインストール 
$ sudo yum install autoconf automake cmake freetype-devel \
     gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel

OpenCVのインストール
$ git clone https://github.com/Itseez/opencv.git
$ cd opencv
$ mkdir build
$ cd build
$ PKG_CONFIG_PATH=/usr/local/lib/pkgconfig cmake ..
$ make
$ sudo make install

ビルド時に FFmpeg の静的リンクがうまくいかないとき、動的リンクを行う。
(https://www.hiroom2.com/2016/06/01/centos-7-opencv-3-1%E3%82%92%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B/参照)
$sed -i -e 's/libavformat\.a/libavformat.so/g' \
      -e 's/libavutil\.a/libavutil.so/g' \
      -e 's/libswscale\.a/libswscale.so/g' \
      -e 's/libavresample\.a/libavresample.so/g' \
      -e 's/libavcodec\.a/libavcodec.so/g' \
      cmake/OpenCVFindLibsVideo.cmake

サンプルの動作確認
$ cd ../samples
$ mkdir build
$ cd build
$ cmake ..
$ make
$ ./cpp/cpp-example-example