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