みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語、行列の積を求めるプログラムについて

「次に示す行列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;
}
というプログラムを作ってみましたが、ダメでした。
ちゃんと積の表示が出るようにするにはどこをどう変えるべきでしょうか?

投稿日時 - 2013-08-10 18:46:31

QNo.8214119

困ってます

質問者が選んだベストアンサー

#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;
}

投稿日時 - 2013-08-11 20:32:49

お礼

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

投稿日時 - 2013-08-11 23:46:07

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

今のプログラムだと
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] + ....
ですよね?

投稿日時 - 2013-08-10 19:08:38

お礼

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

投稿日時 - 2013-08-11 23:47:12

ANo.1

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

投稿日時 - 2013-08-10 19:04:06

補足

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

投稿日時 - 2013-08-11 01:10:02