- 締切済み
行列の積の求めかた
行列の積を求めるプログラムを組んだのですがうまく表示されないです。 x=1,2,3 4,5,6 y=1,5 5,3 8,1 としの行列の積です。 #include <stdio.h> int main(void) { int i,j; int ma[2][3] = {{1,2,3},{4,5,6}}; int mb[3][2] = {{1,5},{5,3},{8,1}}; int mc[2][2] = {0}; for(i=0;i<2;i++) for(j=0;j<3;j++) mc[i][i] += ma[i][j]*mb[j][i]; mc[1-i][i] += ma[1-i][j]*mb[j][i]; for(i=0;i<2;i++){ for(j=0;j<2;j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); } 結果は↓のようになります。 38 0 0 41 まだプログラミングをはじめて日が浅いので基本てきなとこが抜けてる かもしれません。よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- N-Ishikawa
- ベストアンサー率25% (1/4)
行列の積ですか。もう20年前のことなのでどう計算すればいいのか サッパリ忘れてしまいましたが..... 大括弧で括っていないためにループの範囲が間違っているように見えます。 ※for文やif文で大括弧を使用しないと直後の1文しか実行の対象にしてくれません。 for(i=0;i<2;i++) for(j=0;j<3;j++) mc[i][i] += ma[i][j]*mb[j][i]; ←ここしか実行されない mc[1-i][i] += ma[1-i][j]*mb[j][i]; ←i=2,j=3で一回しか実行されない。ここもループさせるなら上の行と大括弧で括る必要あり ループ範囲を可視化しやすいように以下のように書いた方がいいかと思います。 for(i=0;i<2;i++) for(j=0;j<3;j++) { mc[i][i] += ma[i][j]*mb[j][i]; mc[1-i][i] += ma[1-i][j]*mb[j][i]; } ちなみに行列の積のサンプルは以下URLでも記載されていますね。 参考にされては如何でしょうか? http://mitv2.net/matrix/multi_matrix.html
- Tacosan
- ベストアンサー率23% (3656/15482)
今は最終的に 2×2行列になるからいいけど, 10×15行列になるときにも 10行 (あるいは 15行) ずらっと並べるつもり? 行や列の数が不定だった場合にどうすればいいと思う?
- Tacosan
- ベストアンサー率23% (3656/15482)
読み返してみたら #1 の最初の文は誤解を生みそうな気がするので変更. 上の for の部分は忘れてしまって, #2 でいわれるような 3重ループに直しちゃってください (補足ありがとうございます>#2).
- asuncion
- ベストアンサー率33% (2127/6289)
#1さんの回答に補足します。 #1さんが3重ループと書かれているのは、 i行目の処理 j列目の処理 積のi行j列の要素は、「掛けられる行列のi行k列 * 掛ける行列のk行j列」の和 という意味です。
お礼
回答ありがとうございます。三重ループで作ってみます!
- Tacosan
- ベストアンサー率23% (3656/15482)
mc に積を求めている上の 2つの for文と, 求めた mc を表示している下の 2つの for 文の違いをじっくりと見てください. でも, 「行列の積」を求めるときには普通 3重ループにするものだよ. 今の場合は「たまたま」 2行 2列だからいいかもしれないけど, 一般的にはダメなことは理解できるよね?
お礼
回答ありがとうございます。 まだ一般的になぜダメかすぐにわからないです 汗 まずは三重ループをがんばってみます!。