一回も披露したことのない豆知識

「次に示す行列x,yの積を求めるプログラムを作成せよ。
  x[2][3]={{1,2,3},{4,5,6}} y=[3][2]={{1,5},{5,3},{81}}」
という問題です。自分ではとりあえず、
#include<stdio.h>
int main(void)
{
int i,j;
int x[2][3]={{1,2,3},{4,5,6}};
int y[3][2]={{1,5},{5,3},{8,1}};
int xy[3][3]={0};

for(i=0;i<3;i++)
for(j=0;j<3;j++)
xy[i][j]=x[i][j]*y[i][j];

for(i=0;i<3;i++){
for(j=0;j<3;j++)
printf("%3d",xy[i][j]);
putchar('\n');
}
return 0;
}
というプログラムを作ってみましたが、ダメでした。
ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?

A 回答 (3件)

#include<stdio.h>


int main(void)
{
int x[2][3] = { { 1, 2, 3 }, { 4, 5, 6} };
int y[3][2] = { { 1, 5 }, { 5, 3 }, { 8, 1 } };
int xy[2][2];
int i, j, k;

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
xy[i][j] = 0;
for (k = 0; k < 3; k++) {
xy[i][j] += x[i][k] * y[k][j];
}
}
}

for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++) {
printf("%4d", xy[i][j]);
}
putchar('\n');
}
return 0;
}
    • good
    • 5
この回答へのお礼

ちゃんとできました!i=2,j=2にすれば良いのではないかとは思ったんですけど
そこからどうすればいいのか分かりませんでした。
なるほど、新しくkを作ってxy[i][j]+=にすればよかったんですね。
理屈も理解できました。どうもありがとうございます。

お礼日時:2013/08/11 23:46

今のプログラムだと


for(i=0;i<3;i++)
for(j=0;j<3;j++)
xy[i][j]=x[i][j]*y[i][j];

で I-2, j=2 のとき、 x[i][j], y[i][j] はどうなるでしょう?


そして、行列の積をよく考えましょう。
xy[0][0] = x[0][0] * y[0][0] + x[0][1] * y[1][0] + ....
ですよね?
    • good
    • 1
この回答へのお礼

もう一人の方のアドバイスもあり、しっかり理解できました。
ありがとうございます(^^)

お礼日時:2013/08/11 23:47

2行3列と3行2列の積は、何行何列になりますか?


また、その行列xとyの積を手で計算するとき、どういう風にしますか?

この回答への補足

回答ありがとうございます、2行2列ですね。
間違いに気づきました、が、
やっぱりプログラムで表示しようとしてもいまいち分かりません。
よければヒントだけでも教えて頂けないでしょうか?

補足日時:2013/08/11 01:10
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報