next up previous contents
: 2次元テンソル : 行列と行列の積 : 行列と行列の積   目次

実装

行列と行列の積の積演算を関数として以下のように実装する。

/* 行列と行列の積の積 */
void WH_Matrix__whM_mul_whM_OUT_whM
(int nRows_A, int nColumns_A, void *whM_A,
 int nRows_B, int nColumns_B, void *whM_B_,
 int nRows_C, int nColumns_C, void *OUT__whM_C)
/*
  入力引数:
    nRows_A は行列 whM_A の行数
    nColumns_A は行列 whM_A の列数
    whM_A は行列
    nRows_B は行列 whM_B の行数
    nColumns_B は行列 whM_B の列数
    whM_B は行列
    nRows_C は行列 OUT__whM_C の行数
    nColumns_C は行列 OUT__whM_C の列数
  出力引数:
    OUT__whM_C は行列で、whM_A と whM_B の積
*/
{
  int i, j, k;

  assert(nRows_C == nRows_A);
  assert(nColumns_C == nColumns_B);
  assert(nColumns_A == nRows_B);

  for (i = 0; i < nRows_C; i++) {
    for (j = 0; j < nColumns_C; j++) {
      WH_MATRIX__AT(OUT__whM_C, 
          nRows_C, nColumns_C, i, j) = 0.0;
      for (k = 0; k < nColumns_A; k++) {
        WH_MATRIX__AT(OUT__whM_C, 
            nRows_C, nColumns_C, i, j) 
          += WH_MATRIX__AT(whM_A, 
                 nRows_A, nColumns_A, i, k) 
            * WH_MATRIX__AT(whM_B, 
                  nRows_B, nColumns_B, k, j);
      }
    }
  }
}

行列の転置と行列の積の積演算を関数として以下のように実装する。

/* 行列の転置と行列の積の積 */
void WH_Matrix__whTrans_whM_mul_whM_OUT_whM
(int nRows_A, int nColumns_A, void *whM_A,
 int nRows_B, int nColumns_B, void *whM_B_,
 int nRows_C, int nColumns_C, void *OUT__whM_C)
/*
  入力引数:
    nRows_A は行列 whM_A の行数
    nColumns_A は行列 whM_A の列数
    whM_A は行列
    nRows_B は行列 whM_B の行数
    nColumns_B は行列 whM_B の列数
    whM_B は行列
    nRows_C は行列 OUT__whM_C の行数
    nColumns_C は行列 OUT__whM_C の列数
  出力引数:
    OUT__whM_C は行列で、whM_A と whM_B の積
*/
{
  int i, j, k;

  assert(nRows_C == nColumns_A);
  assert(nColumns_C == nColumns_B);
  assert(nRows_A == nRows_B);

  for (i = 0; i < nRows_C; i++) {
    for (j = 0; j < nColumns_C; j++) {
      WH_MATRIX__AT(OUT__whM_C, 
          nRows_C, nColumns_C, i, j) = 0.0;
      for (k = 0; k < nRows_A; k++) {
        WH_MATRIX__AT(OUT__whM_C, 
            nRows_C, nColumns_C, i, j) 
          += WH_MATRIX__AT(whM_A, 
                 nRows_A, nColumns_A, k, i) 
            * WH_MATRIX__AT(whM_B, 
                  nRows_B, nColumns_B, k, j);
      }
    }
  }
}

行列と行列の転置の積の積演算を関数として以下のように実装する。

/* 行列と行列の転置の積の積 */
void WH_Matrix__whM_mul_whTrans_whM_OUT_whM
(int nRows_A, int nColumns_A, void *whM_A,
 int nRows_B, int nColumns_B, void *whM_B_,
 int nRows_C, int nColumns_C, void *OUT__whM_C)
/*
  入力引数:
    nRows_A は行列 whM_A の行数
    nColumns_A は行列 whM_A の列数
    whM_A は行列
    nRows_B は行列 whM_B の行数
    nColumns_B は行列 whM_B の列数
    whM_B は行列
    nRows_C は行列 OUT__whM_C の行数
    nColumns_C は行列 OUT__whM_C の列数
  出力引数:
    OUT__whM_C は行列で、whM_A と whM_B の積
*/
{
  int i, j, k;

  assert(nRows_C == nRows_A);
  assert(nColumns_C == nRows_B);
  assert(nColumns_A == nColumns_B);

  for (i = 0; i < nRows_C; i++) {
    for (j = 0; j < nColumns_C; j++) {
      WH_MATRIX__AT(OUT__whM_C, 
          nRows_C, nColumns_C, i, j) = 0.0;
      for (k = 0; k < nColumns_A; k++) {
        WH_MATRIX__AT(OUT__whM_C, 
            nRows_C, nColumns_C, i, j) 
          += WH_MATRIX__AT(whM_A, 
                 nRows_A, nColumns_A, i, k) 
            * WH_MATRIX__AT(whM_B, 
                  nRows_B, nColumns_B, j, k);
      }
    }
  }
}



Hiroshi KAWAI 平成15年8月11日