• ベストアンサー

配列について

以下の配列についての問題でわからないことがあるので、教えてください。 /* x と y の積を求める。 */ #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 ans[2][2] = {0}; int i, j, k, temp; for(i = 0; i < 2; i++) { for (k = 0; k < 2; k++) { temp = 0; for(j = 0; j < 3; j++) { temp += x[i][j] * y[j][k]; } ans[i][k] = temp; } } for(i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { printf("%4d",ans[i][j]); } putchar('\n'); } return(0); } 以下の部分について詳しく説明してもらえないでしょうか? int ans[2][2] = {0};  int i, j, k, temp; for(i = 0; i < 2; i++) { for (k = 0; k < 2; k++) { temp = 0; for(j = 0; j < 3; j++) { temp += x[i][j] * y[j][k]; } ans[i][k] = temp; } }

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

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

> int ans[2][2] = {0}; ansの全要素を0で初期化。 (指定された初期値の数が配列の要素数より少ない場合、残りの要素は0で初期化されます。) > for(i = 0; i < 2; i++) { >  for (k = 0; k < 2; k++) { >   temp = 0; >   for(j = 0; j < 3; j++) { >    temp += x[i][j] * y[j][k]; >   } >   ans[i][k] = temp; >  } > } 数学における行列の積の定義通りの記述ですが 何が分からないのですか?

hatenan114
質問者

お礼

ありがとうございます。 ”数学における行列の積の定義” を調べて理解しました。 またお願いします。

hatenan114
質問者

補足

x[i][j] と y[j][k] について教えてください。 なぜ、x の 列[j] と y の 行[j]が 同じなのでしょうか? 基本的なことですみません。

その他の回答 (3)

  • Werner
  • ベストアンサー率53% (395/735)
回答No.4

> なぜ、x の 列[j] と y の 行[j]が > 同じなのでしょうか? 行列の積がそのように定義されているから。 http://ja.wikipedia.org/wiki/%E8%A1%8C%E5%88%97#.E8.A1.8C.E5.88.97.E3.81.AE.E7.A9.8D 数学の授業とかで習ってないですか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

> なぜ、x の 列[j] と y の 行[j]が > 同じなのでしょうか? i行j列の行列Xとm行n列の行列Yの積が計算できるのは、 jとmが等しいときです。 積は、i行n列の行列になります。

hatenan114
質問者

お礼

回答していただきありがとうございます。 また宜しくお願いします。

  • lesskey
  • ベストアンサー率33% (66/200)
回答No.2

> x[i][j] > と > y[j][k] > について教えてください。 > なぜ、x の 列[j] と y の 行[j]が > 同じなのでしょうか? 何故3回ループしているのか?という話ですか? それであればソース見れば一目両全。 > int x[2][3] = {{1,2,3}, {4, 5, 6}}; > int y[3][2] = {{1, 5}, {5, 3}, {8, 1}}; x は2次元目の配列数が3、y は1次元目の配列が 3 だから ループ回数が同様になるのだと思います。

hatenan114
質問者

お礼

回答ありがとうございます。 ループ回数が同様になるというポイントがわかりました。 また宜しくお願いします。