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で初期化されていたとしても、上記を省略してはいけない。