- ベストアンサー
C言語で行列の積を計算するプログラム
- C言語のプログラムで行列の積を計算する方法について解説します。
- 行列の積を計算する際に、初期化のタイミングを間違えると実行結果が異なる場合があります。
- 正しい初期化の方法を確認し、問題なく行列の積を計算できるようにしましょう。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
+= 演算子を使っているので、積算しています(計算結果をmatCに足し続ける) しかし、for(k = 0; k < 4; ++k){のループの度にmatCを初期化してしまうので、最後の掛け算しか残っていないことになる。 と読めます。
その他の回答 (3)
- KEIS050162
- ベストアンサー率47% (890/1879)
計算の過程が知りたいとき、部分的にデバッグ用に、printf() 文とgetch() などを組み合せて追加し、処理の過程などを確認してみると良いでしょう。デバッグが終わったら、コメントにしてしまえばOKです。 for(k = 0; k < 4; ++k){ matC[i][j]+=matA[i][k]*matB[k][j]; printf( "matc{ %d ][ %d ] = %d\n". i, i, matc[i][i] ); getch(); デバッグが終わったら、コメントにする。 // printf( "matc{ %d ][ %d ] = %d\n". i, i, matc[i][i] ); // getch(); 色んな場所に上記の様なprintf()を入れ込んで試してみてください。
- Wr5
- ベストアンサー率53% (2173/4061)
ステップ実行のやりかたとか調べるか、pritnf()などで変数の内容出力してみるとかしないんですか? 質問乱立しまくりのようですが……。 for(i = 0; i < 4; ++i){ for(j = 0; j < 4; ++j){ matC[i][j]=0; /*初期化が必要*/ for(k = 0; k < 4; ++k){ matC[i][j]+=matA[i][k]*matB[k][j]; } } } を for(i = 0; i < 4; ++i){ for(j = 0; j < 4; ++j){ for(k = 0; k < 4; ++k){ matC[i][j]=0; /*初期化が必要*/ matC[i][j]+=matA[i][k]*matB[k][j]; } } } にしたら、結果が異なるのはな~んでだろ~? って質問でいいんですかね? for(k = 0; k < 4; ++k)のループで matC[i][j]=0;により0が入ります。 次にmatC[i][j]+=matA[i][k]*matB[k][j];の演算結果を代入します。 次のループに入って、 matC[i][j]=0;により0が入ります。 # つまり「以前の演算結果はご破算にしろ」と言っています。 それを繰り返して、結果として有効になるのは最後の演算結果だけです。 「そうしろ」というコードなのですから、CPUは言われたとおりに忠実に実行しただけです。
- hirotn
- ベストアンサー率59% (147/246)
matC[i][j]+=matA[i][k]*matB[k][j];を、 matC[i][j]=matA[i][k]*matB[k][j]; として試行してみてください。実行結果が異なる場合とおなじになりませんか?