行列と行列の積の積演算を関数として以下のように実装する。
/* 行列と行列の積の積 */ 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); } } } }