- 行列
- 行列とは
行列とは数値を縦横に並べたもの。n×m行列とは縦n行、横m列に数値を並べた行列のことを指す。
n×mの行列Aは以下のように表記される。
aij(i=1..n)(j=1..m)は成分(あるいは要素)を表す。
i,jは添字(そえじ)とよばれるもので行列内の要素の位置を表す。
例えばa21であれば、2行1列目の成分を表す。(以下の2×3行列の例では3)
プログラミング言語での2次元配列に対応し、Java等多くのプログラミング言語の表記ともほぼ一致する。
※ただしC/C++やJavaなどでは添え字が0から始まることに注意
-
n×m行列A
\[
A=
\begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1m} \\
a_{21} & a_{22} & \cdots & a_{2m} \\
\vdots & \vdots & \ddots & \vdots \\
a_{n1} & a_{n2} & \cdots & a_{nm}
\end{bmatrix}
\]
-
2×3行列の例
\[
\begin{bmatrix}
1 & 5 & 2 \\
3 & 6 & 8 \\
\end{bmatrix}
\]
- コード(2次元配列による行列表現の例)
//int型の2×3行列、A[2][3]の宣言
int[][] A={
{1,5,2},
{3,6,8}
};
//要素2行1列目を表示
System.out.println(A[1][0]);//3
- 正方行列
行列のうち行数と列数が同じもの、すなわちn=mの行列を正方行列という
n×n行列
\[
\begin{bmatrix}
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{bmatrix}
\]
3×3正方行列
\[
\begin{bmatrix}
1 & -4 & 9 \\
7 & 2 & -5 \\
-6 & 8 & 3
\end{bmatrix}
\]
- 転置行列
n×m行列Aにおいて行と列の成分を入れ替えたもの、
すなわちAijをAijにした行列を行列Aの転置行列という。
行列Aの転置行列をATとすると以下のようになる
\[
A=
\begin{bmatrix}
a_{11} & a_{12} & \cdots & a_{1m} \\
a_{21} & a_{22} & \cdots & a_{2m} \\
\vdots & \vdots & \ddots & \vdots \\
a_{n1} & a_{n2} & \cdots & a_{nm}
\end{bmatrix}
\]
\[
A^T=
\begin{bmatrix}
a_{11} & a_{21} & \cdots & a_{n1} \\
a_{12} & a_{22} & \cdots & a_{n2} \\
\vdots & \vdots & \ddots & \vdots \\
a_{1m} & a_{2m} & \cdots & a_{nm}
\end{bmatrix}
\]
2×3行列の例
\[
x=
\begin{bmatrix}
1 & 5 & 2 \\
3 & 6 & 8 \\
\end{bmatrix}
\]
\[
x^T=
\begin{bmatrix}
1 & 3 \\
5 & 6 \\
2 & 8
\end{bmatrix}
\]
また転置行列には以下のような性質がある
\[
(A^T)^T=A
\]
2×3行列の例
\[
x=
\begin{bmatrix}
1 & 5 & 2 \\
3 & 6 & 8 \\
\end{bmatrix}
\]
\[
x^T=
\begin{bmatrix}
1 & 3 \\
5 & 6 \\
2 & 8
\end{bmatrix}
\]
\[
(x^T)^T=
\begin{bmatrix}
1 & 5 & 2 \\
3 & 6 & 8 \\
\end{bmatrix}
\]
コード
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
tx[j][i]=x[i][j];
}
}
行列の演算
行列の加減算と乗法
- 行列の加算
2つの行列が同じ型(行と列の数が同じ)のとき、加算(和)が定義される。
型が異なる場合、加算は定義されない
- ベクトル(1×n行列もしくはn×1行列)の加算
\[
\begin{bmatrix}
a_1\\
a_2\\
\vdots\\
a_n
\end{bmatrix}
+
\begin{bmatrix}
b_1\\
b_2\\
\vdots\\
b_n
\end{bmatrix}
=
\begin{bmatrix}
c_1\\
c_2\\
\vdots\\
c_n
\end{bmatrix}
\]
もしくは
\[
\begin{bmatrix}
a_1 & a_2 \cdots & a_n
\end{bmatrix}
+
\begin{bmatrix}
b_1 & b_2 \cdots & b_n
\end{bmatrix}
=
\begin{bmatrix}
c_1 & c_2 \cdots & c_n
\end{bmatrix}
\]
すなわち\[a_i+b_i=c_i(i=1,2,\dots ,n)\]
コード
for(int i=0;i<n;i++) {
c[i]=a[i]+b[i];
}
サンプルコード
n×m型行列の加算
\[
\begin{bmatrix}
a_{11} &a_{12} &\cdots &a_{1m}\\
a_{21} &a_{22} &\cdots &a_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
a_{n1} &a_{n2} &\cdots &a_{nm}\\
\end{bmatrix}
+
\begin{bmatrix}
b_{11} &b_{12} &\cdots &b_{1m}\\
b_{21} &b_{22} &\cdots &b_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
b_{n1} &b_{n2} &\cdots &b_{nm}\\
\end{bmatrix}
=
\begin{bmatrix}
c_{11} &c_{12} &\cdots &c_{1m}\\
c_{21} &c_{22} &\cdots &c_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
c_{n1} &c_{n2} &\cdots &c_{nm}\\
\end{bmatrix}
\]
すなわち\[a_{ij}+b_{ij}=c_{ij}(i=1,2,\dots ,n)(j=1,2,\dots ,m)\]
コード
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++){
c[i][j]=a[i][j]+b[i][j];
}
}
サンプルコード
行列の減算
2つの行列が同じ型(行と列の数が同じ)のとき、減算(差)が定義される。
型が異なる場合、減算は定義されない
- ベクトルの減算
\[
\begin{bmatrix}
a_1\\
a_2\\
\vdots\\
a_n
\end{bmatrix}
-
\begin{bmatrix}
b_1\\
b_2\\
\vdots\\
b_n
\end{bmatrix}
=
\begin{bmatrix}
c_1\\
c_2\\
\vdots\\
c_n
\end{bmatrix}
\]
すなわち\[a_i-b_i=c_i(i=1,2,\dots ,n)\]
コード
for(int i=0;i<n;i++) {
c[i]=a[i]-b[i];
}
サンプルコード
n×m型行列の減算
\[
\begin{bmatrix}
a_{11} &a_{12} &\cdots &a_{1m}\\
a_{21} &a_{22} &\cdots &a_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
a_{n1} &a_{n2} &\cdots &a_{nm}\\
\end{bmatrix}
-
\begin{bmatrix}
b_{11} &b_{12} &\cdots &b_{1m}\\
b_{21} &b_{22} &\cdots &b_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
b_{n1} &b_{n2} &\cdots &b_{nm}\\
\end{bmatrix}
=
\begin{bmatrix}
c_{11} &c_{12} &\cdots &c_{1m}\\
c_{21} &c_{22} &\cdots &c_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
c_{n1} &c_{n2} &\cdots &c_{nm}\\
\end{bmatrix}
\]
すなわち\[a_{ij}-b_{ij}=c_{ij}(i=1,2,\dots ,n)(j=1,2,\dots ,m)\]
コード
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++){
c[i][j]=a[i][j]-b[i][j];
}
}
サンプルコード
行列の乗算
- 行ベクトルと列ベクトルの乗算
\[
\begin{bmatrix}
a_1 &a_2 &\cdots &a_n
\end{bmatrix}
\begin{bmatrix}
b_1\\
b_2\\
\vdots\\
b_n
\end{bmatrix}
=
c
\]
すなわち\[c=\sum_{i=1}^{n}a_ib_i(i=1,2,\dots ,n)\]
コード
for(int i=0;i<n;i++) {
c+=a[i]*b[i];
}
サンプルコード
列ベクトルと行ベクトルの乗算
\[
\begin{bmatrix}
a_1\\
a_2\\
\vdots\\
a_n
\end{bmatrix}
\begin{bmatrix}
b_1 &b_2 &\cdots &b_m
\end{bmatrix}
=
\begin{bmatrix}
c_{11} &c_{12} &\cdots &c_{1m}\\
c_{21} &c_{22} &\cdots &c_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
c_{n1} &c_{n2} &\cdots &c_{nm}\\
\end{bmatrix}
\]
すなわち\[c_{ij}=a_ib_j(i=1,2,\dots ,n)(j=1,2,\dots ,m)\]
コード
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
c[i][j]=a[i]*b[j];
}
}
サンプルコード
行列と列ベクトルの乗算
\[
\begin{bmatrix}
a_{11} &a_{12} &\cdots &a_{1m}\\
a_{21} &a_{22} &\cdots &a_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
a_{n1} &a_{n2} &\cdots &a_{nm}\\
\end{bmatrix}
\begin{bmatrix}
b_1\\
b_2\\
\vdots\\
b_n
\end{bmatrix}
=
\begin{bmatrix}
c_{1}\\
c_{2}\\
\vdots\\\
c_{n}\\
\end{bmatrix}
\]
すなわち\[c_i=\sum_{k=1}^{m}a_{ik}b_k(i=1,2,\dots ,n)(j=1,2,\dots ,n)\]
コード
for(int i=0;i<n;i++) {
for(int k=0;k<m;k++) {
c[i]+=a[i][k]*b[k];
}
}
サンプルコード
行列同士の乗算
\[
\begin{bmatrix}
a_{11} &a_{12} &\cdots &a_{1l}\\
a_{21} &a_{22} &\cdots &a_{2l}\\
\vdots &\vdots &\ddots &\vdots\\\
a_{n1} &a_{n2} &\cdots &a_{nl}\\
\end{bmatrix}
\begin{bmatrix}
b_{11} &b_{12} &\cdots &b_{1m}\\
b_{21} &b_{22} &\cdots &b_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
b_{l1} &b_{l2} &\cdots &b_{lm}\\
\end{bmatrix}
=
\begin{bmatrix}
c_{11} &c_{12} &\cdots &c_{1m}\\
c_{21} &c_{22} &\cdots &c_{2m}\\
\vdots &\vdots &\ddots &\vdots\\\
c_{n1} &c_{n2} &\cdots &c_{nm}\\
\end{bmatrix}
\]
すなわち\[c_{ij}=\sum_{k=1}^{l}a_{ik}b_{kj}(i=1,2,\dots ,m)(j=1,2,\dots ,n)\]
コード
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++){
for(int k=0;k<l;k++) {
c[i][j]+=a[i][k]*b[k][j];
}
}
}
サンプルコード