未分類

【C++】4行3列の行列aと3行4列の行列bの積を行列cに格納するプログラム

行列の積を求める問題です。

とりあえずできたので自分用メモ。

計算サイトでもあっていたのでおそらくあっていると思われる。

プログラムの内容

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);
}

まとめ

簡単だけど難しい。難しいけどクソ簡単。

プログラミングってなんか続けてるだけで頭の中の考え方をアウトプットする練習になりそう。

-未分類
-,