行ベクトルと行列の積演算を関数として以下のように実装する。
/* 行ベクトルと行列の積 */ void WH_Matrix__whRv_mul_whM_OUT_whRv (int nColumns_a, double whRv_a[], int nRows_B, int nColumns_B, void *whM_B, int nColumns_c, double OUT__whRv_c[]) /* 入力引数: nColumns_a は行ベクトル whRv_a の列数 whRv_a は行ベクトル nRows_B は行列 whM_B の行数 nColumns_B は行列 whM_B の列数 whM_B は行列 nColumns_c は行ベクトル OUT__whRv_c の列数 出力引数: OUT__whRv_cは行ベクトルで、whRv_a と whM_B の積 */ { int i, j; assert(nColumns_a == nRows_B); assert(nColumns_c == nColumns_B); for (j = 0; j < nColumns_B; j++) { OUT__whRv_c[j] = 0.0; } for (i = 0; i < nRows_B; i++) { for (j = 0; j < nColumns_B; j++) { OUT__whRv_c[j] += whRv_a[i] * WH_MATRIX__AT(whM_B, nRows_B, nColumns_B, i, j); } } }
列ベクトルの転置と行列の積演算を関数として以下のように実装する。
/* 列ベクトルの転置と行列の積 */ void WH_Matrix__whTrans_whCv_mul_whM_OUT_whRv (int nRows_a, double whCv_a[], int nRows_B, int nColumns_B, void *whM_B, int nColumns_c, double OUT__whRv_c[]) /* 入力引数: nRows_a は列ベクトル whCv_a の行数 whCv_a は列ベクトル nRows_B は行列 whM_B の行数 nColumns_B は行列 whM_B の列数 whM_B は行列 nColumns_c は行ベクトル OUT__whRv_c の列数 出力引数: OUT__whRv_cは行ベクトルで、whRv_a と whM_B の積 */ { int i, j; assert(nRows_a == nRows_B); assert(nColumns_c == nColumns_B); for (j = 0; j < nColumns_B; j++) { OUT__whRv_c[j] = 0.0; } for (i = 0; i < nRows_B; i++) { for (j = 0; j < nColumns_B; j++) { OUT__whRv_c[j] += whCv_a[i] * WH_MATRIX__AT(whM_B, nRows_B, nColumns_B, i, j); } } }