とりあえずできたので自分用メモ。
計算サイトでもあっていたのでおそらくあっていると思われる。
プログラムの内容
3重ループってどうにもこうにもあんまり使わないよね。
動的配列?とかいうらしいけど、やっぱり2重ループぐらいまでが考えやすいと思う。
ただ今回の問題みたいに三重ループまで考えてみると、行列の計算方法とかが(もちろん知ってはいるが)なんかすげぇプログラム的に頭に入ってくる。
これはいいことのような気がする。
void mat_seki(const int a[4][3],const int b[3][4],int c[4][4]) {
int i, j, k;
for (k = 0; k < 4; k++) {
for (j = 0; j < 4; j++) {
for (i = 0; i < 3; i++) {
c[k][j] += a[k][i] * b[i][j];
//printf("%4d", c[k][j]);
}
}
}
}
行列をかける場合は左の行列×右の行列の場合、
完成させられる行列cの行は左の行列に依存して、列は右の行列に依存する、
っていうのがわかってはいても無意識でやっちゃってるから、案外考えるのに時間がかかったりする。
まぁ雰囲気で覚えて融けちゃうんだから、人間ってスパコンなんだろうね。
プログラム全部
計算サイトでも検算してみたので間違いはないかと思われる。
https://keisan.casio.jp/exec/system/1308269580
CASIOさんマジ神。
#include <iostream>
void mat_seki(const int a[4][3],const int b[3][4],int c[4][4]) {
int i, j, k;
for (k = 0; k < 4; k++) {
for (j = 0; j < 4; j++) {
for (i = 0; i < 3; i++) {
c[k][j] += a[k][i] * b[i][j];
//printf("%4d", c[k][j]);
}
}
}
}
void mat_print(const int c[4][4]) {
int i, j, k;
for (k = 0; k < 4; k++) {
for (j = 0; j < 4; j++) {
printf(" %2d",c[k][j]);
}
putchar('\n');
}
}
int main()
{
int a[4][3] = { {1,1,2},{2,3,6},{3,4,2},{4,5,1} };
int b[3][4] = { {1,1,2,4},{2,3,4,1},{3,4,2,1} };
int c[4][4] = { {0} };
mat_seki(a, b, c);
mat_print(c);
}
まとめ
簡単だけど難しい。難しいけどクソ簡単。
プログラミングってなんか続けてるだけで頭の中の考え方をアウトプットする練習になりそう。