- 締切済み
行列の掛け算
こんにちは。 今回のプログラムは4×4の行列と1×4の行列を掛け合わせて、 その結果を出力するというものです。 読み込むデータはdata[l][j]で 中身は 1 2 3 4 5 2 3 4 5 1 3 1 4 5 6 2 3 1 9 7 といった形になっています。 最初の 1 2 3 4 2 3 4 5 3 1 4 5 2 3 1 9 が4×4の行列になっていて、それに 4 5 5 9 を掛け合わせるというものです。その結果を まずx[0][j]にいれ、その結果と 1 2 3 4 2 3 4 5 3 1 4 5 2 3 1 9 をもう一度掛け合わせその結果を x[1][j]にいれ、 x[k][j]を出力するというプログラムです。 行列の掛け算の部分のプログラムは以下の通りです。 sprintf(fname,"impulse[%d].txt",c); fp = fopen(fname,"a"); for(k=0;k<2;k++){ for(j=0;j<4;j++){ for(l=0;l<4;l++){ x[k][j] +=data[l][j] * data[5][l]; data[5][l] = x[k][j]; fprintf(fp,"%8.8f\n",x[k][j]); } } } fclose(fp); です。これだと結果がすべて0となって出力されてしまいます。どこがいけないのでしょうか。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- foobar
- ベストアンサー率44% (1423/3185)
もうひとつ 0. x[][]が初期化されていない というのも、気になります。 一番の問題は data[4][l]=x[k][i] が一番内側のループにあることかと。 何が起きるかちょっと書き下してみると [k=0,j=0,l=0] x[0][0] +=data[0][0] * data[4][0]; data[4][0] = x[0][0]; とここでdata[4][0]が書き変わる fprintf() [k=0,j=0,l=1] x[0][0] +=data[1][0] * data[4][1]; data[4][1] = x[0][0]; とここでdata[4][1]が書き変わる fprintf() . . と続いて、次のj=1になったときには . . [k=0,j=1,l=0] x[0][1] +=data[0][1] * data[4][0]; data[4][0]は上で既に書き換えられている data[4][0] = x[0][1]; とここでdata[4][0]がまた書き変わる fprintf() という具合に、どんどんdata[4][l]が書き変わっていってしまうかと。
- foobar
- ベストアンサー率44% (1423/3185)
1. ループの一番内側に fprintfが入ってるけど、これで良いのかな?(途中結果も全て出力させてます?) 2. ご質問の x[k][j] +=data[l][j] * data[5][l]; 計算が始まる前って data[5][*]ってどんな数値が入ってます? (データが入ってるのはdata[4][*]までのような気が、、。) 3. data[5][l]=x[k][j] ってのがループの一番内側に入ってますけど、これだとまずいような、、。
補足
回答ありがとうございます! 1. ループの一番内側に fprintfが入ってるけど、これで良いのかな?(途中結果も全て出力させてます?) これで結果を出力するつもりなのですが、ループの外におくべきなのでしょうか? 2. ご質問の x[k][j] +=data[l][j] * data[5][l]; 計算が始まる前って data[5][*]ってどんな数値が入ってます? (データが入ってるのはdata[4][*]までのような気が、、。) すみません。間違えました。data[4][*]です。 3. data[5][l]=x[k][j] ってのがループの一番内側に入ってますけど、これだとまずいような、、。 そうなんですか! 最初に計算されたx[k][j]をもう一度data[4][l]に入れて繰り返し計算をさせたいのですが・・・
お礼
for(k=0;k<2;k++){ for(j=0;j<4;j++){ sm = 0.0; for(l=0;l<4;l++){ sm +=data[l][j] * data[4][l]; } x[k][j] = sm; fprintf(fp2,"%8.8f\n",x[k][j]); data[4][l] = x[k][j]; k++; } } } fclose(fp2); } と直したのですが、最初の結果は出力されるのですが 、その結果と再び4×4の行列との掛け算の 結果が出力されません。 どうすればよいでしょうか?
補足
そうだったんですか! data[4][1]が書き換わっていたんですね! sprintf(fname,"impulse[%d].txt",c); fp = fopen(fname,"a"); for(k=0;k<2;k++){ for(j=0;j<4;j++){ for(l=0;l<4;l++){ x[k][j] +=data[l][j] * data[4][l]; } } data[4][l] = x[k][j]; fprintf(fp,"%8.8f\n",x[k][j]); } fclose(fp); そこで、としてみたのですが、結果が出力されませんでした。