行列と列ベクトルの積演算を関数として以下のように実装する。
/* 行列と列ベクトルの積 */ void WH_Matrix__whM_mul_whCv_OUT_whCv (int nRows_A, int nColumns_A, void *whM_A, int nRows_b, double whCv_b[], int nRows_c, double OUT__whCv_c[]) /* 入力引数: nRows_A は行列 whM_A の行数 nColumns_A は行列 whM_A の列数 whM_A は行列 nRows_b は列ベクトル whCv_b の行数 whCv_b は列ベクトル nRows_c は列ベクトル OUT__whCv_c の行数 出力引数: OUT__whCv_cは列ベクトルで、whM_A と whCv_b の積 */ { int i, j; assert(nRows_b == nColumns_A); assert(nRows_c == nRows_A); for (i = 0; i < nRows_A; i++) { OUT__whCv_c[i] = 0.0; for (j = 0; j < nColumns_A; j++) { OUT__whCv_c[i] += WH_MATRIX__AT(whM_A, nRows_A, nColumns_A, i, j) * whCv_b[j]; } } }
行列と行ベクトルの転置の積演算を関数として以下のように実装する。
/* 行列と行ベクトルの転置の積 */ void WH_Matrix__whM_mul_whTrans_whRv_OUT_whCv (int nRows_A, int nColumns_A, void *whM_A, int nColumns_b, double whRv_b[], int nRows_c, double OUT__whCv_c[]) /* 入力引数: nRows_A は行列 whM_A の行数 nColumns_A は行列 whM_A の列数 whM_A は行列 nColumns_b は行ベクトル whRv_b の列数 whRv_b は行ベクトル nRows_c は列ベクトル OUT__whCv_c の行数 出力引数: OUT__whCv_cは列ベクトルで、whM_A と whCv_b の積 */ { int i, j; assert(nColumns_b == nColumns_A); assert(nRows_c == nRows_A); for (i = 0; i < nRows_A; i++) { OUT__whCv_c[i] = 0.0; for (j = 0; j < nColumns_A; j++) { OUT__whCv_c[i] += WH_MATRIX__AT(whM_A, nRows_A, nColumns_A, i, j) * whRv_b[j]; } } }