C言語で行列の積を求める関数の作成方法とよくある間違いの解決

C言語関連

C言語を使って行列の積を求めるプログラムを書く際、関数の構造や配列の扱いに悩むことがあります。特に、行列Aと行列Bの積を求める際に関数内で正しい処理を行うためには、適切な引数や配列の操作が重要です。この記事では、行列の積を求める関数の作成方法と、よくある間違いについて解説します。

行列の積を求める関数の基本構造

行列の積を求める基本的な方法は、2つの行列の対応する要素を掛け算して、結果を新しい行列に格納することです。以下に、行列A(3×3)と行列B(3×4)の積を求める例を示します。

#include 

void matrix(int a[3][3], int b[3][4], int c[3][4]) {
    int n, m, l;
    for (n = 0; n < 3; n++) {
        for (l = 0; l < 4; l++) {
            c[n][l] = 0;
            for (m = 0; m < 3; m++) {
                c[n][l] += a[n][m] * b[m][l];
            }
        }
    }
}

void main() {
    int a[3][3] = {{3, 2, -3}, {1, -5, 2}, {4, 7, 1}};
    int b[3][4] = {{-1, 5, 8, 6}, {19, 2, 4, 3}, {-7, 1, 3, -2}};
    int c[3][4];

    matrix(a, b, c);

    for (int n = 0; n < 3; n++) {
        for (int l = 0; l < 4; l++) {
            printf("%4d ", c[n][l]);
        }
        printf("\n");
    }
}

質問者のコードの問題点

質問者のコードにはいくつか問題があります。特に、`matrix()`関数内で`a`と`b`行列の値を指定していないため、関数が正しく動作しません。また、関数の返り値を使って行列の値を出力しようとしていますが、`matrix()`関数は値を返さないため、代わりに参照渡しを使用して行列`c`に結果を格納する必要があります。

また、`main()`関数内で`matrix()`関数を呼び出す際に、行列`a`と`b`を引数として渡すことを忘れないようにしましょう。

修正後のコードと解説

以下のように修正することで、行列の積を正しく求め、結果を出力することができます。

#include 

void matrix(int a[3][3], int b[3][4], int c[3][4]) {
    int n, m, l;
    for (n = 0; n < 3; n++) {
        for (l = 0; l < 4; l++) {
            c[n][l] = 0;
            for (m = 0; m < 3; m++) {
                c[n][l] += a[n][m] * b[m][l];
            }
        }
    }
}

void main() {
    int a[3][3] = {{3, 2, -3}, {1, -5, 2}, {4, 7, 1}};
    int b[3][4] = {{-1, 5, 8, 6}, {19, 2, 4, 3}, {-7, 1, 3, -2}};
    int c[3][4];

    matrix(a, b, c);

    for (int n = 0; n < 3; n++) {
        for (int l = 0; l < 4; l++) {
            printf("%4d ", c[n][l]);
        }
        printf("\n");
    }
}

重要なポイント: 配列の引数と参照渡し

関数に配列を渡す際は、配列自体を渡すのではなく、その参照を渡すことになります。このため、関数内で渡された配列を変更することができます。`matrix()`関数では、`a`, `b`, `c`の各行列を参照渡しで受け取り、行列`c`に計算結果を格納しています。

また、行列の積を求める際には、内積の計算が必要になります。質問者のコードでも正しく計算されていた部分はありますが、行列の参照方法に誤りがあったため、出力結果が得られなかったのです。

まとめ

C言語で行列の積を求める際には、配列の操作や参照渡しに注意が必要です。質問者のコードでは、関数内で配列の初期化や参照の方法に誤りがありました。修正後のコードを参考にして、行列の積を正しく計算できるようになります。行列演算の基本を理解することで、より複雑なプログラムにも対応できるようになります。

コメント

タイトルとURLをコピーしました