Javaプログラミング

トップページ      |      目次
←前へ      次へ→

  • 行列
    • 行列とは
    • 行列とは数値を縦横に並べたもの。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];
          		}
          	}
          }
          
          サンプルコード


←前へ      次へ→