プログラミング+α学習ブログ

勉強したことの備忘録です。

2行3列の行列と3行2列の行列の積を求めるプログラム

#include <stdio.h>

/*--- 2行3列の行列maと3行2列の行列mbの積にmcに格納する ---*/
void mul(const int ma[2][3], const int mb[3][2], int mc[2][2])
{
    int i, j, k;
    
    for (i = 0; i < 2; i++)
        for (j = 0; j < 2; j++) {
            mc[i][j] = 0;
            for (k = 0; k < 3; k++)
                mc[i][j] += ma[i][k] * mb[k][j];
        }
}

int main(void)
{
    int i, j;
    int x[2][3] = { {1, 2, 3}, {4, 5, 6} };
    int y[3][2] = { {1, 5}, {5, 3}, {8, 1} };
    int z[2][2];
    
    mul(x, y, z);
    
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++)
            printf("%3d", z[i][j]);
        putchar('\n');
    }
    
    return (0);
}

実行結果

35 14
77 41

行列の積

積を格納する配列mcの要素に全て0が格納されているとの前提を勝手に設けることはできない。
その理由は、関数の部品としての独立性を考えなければならないため。
なのでmul関数に下記は必須。

mc[i][j] = 0;

関数を部品として、独立性を保つため、たとえmain関数でzの全要素が0で初期化されていたとしても、上記を省略してはいけない。