• 締切済み

行列の積の求めかた

行列の積を求めるプログラムを組んだのですがうまく表示されないです。 x=1,2,3  4,5,6 y=1,5  5,3  8,1 としの行列の積です。 #include <stdio.h> int main(void) { int i,j; int ma[2][3] = {{1,2,3},{4,5,6}}; int mb[3][2] = {{1,5},{5,3},{8,1}}; int mc[2][2] = {0}; for(i=0;i<2;i++) for(j=0;j<3;j++) mc[i][i] += ma[i][j]*mb[j][i]; mc[1-i][i] += ma[1-i][j]*mb[j][i]; for(i=0;i<2;i++){ for(j=0;j<2;j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); } 結果は↓のようになります。 38 0 0 41 まだプログラミングをはじめて日が浅いので基本てきなとこが抜けてる かもしれません。よろしくお願いします。

みんなの回答

回答No.5

行列の積ですか。もう20年前のことなのでどう計算すればいいのか サッパリ忘れてしまいましたが..... 大括弧で括っていないためにループの範囲が間違っているように見えます。 ※for文やif文で大括弧を使用しないと直後の1文しか実行の対象にしてくれません。 for(i=0;i<2;i++) for(j=0;j<3;j++) mc[i][i] += ma[i][j]*mb[j][i]; ←ここしか実行されない mc[1-i][i] += ma[1-i][j]*mb[j][i]; ←i=2,j=3で一回しか実行されない。ここもループさせるなら上の行と大括弧で括る必要あり ループ範囲を可視化しやすいように以下のように書いた方がいいかと思います。 for(i=0;i<2;i++) for(j=0;j<3;j++) { mc[i][i] += ma[i][j]*mb[j][i]; mc[1-i][i] += ma[1-i][j]*mb[j][i]; } ちなみに行列の積のサンプルは以下URLでも記載されていますね。 参考にされては如何でしょうか? http://mitv2.net/matrix/multi_matrix.html

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

今は最終的に 2×2行列になるからいいけど, 10×15行列になるときにも 10行 (あるいは 15行) ずらっと並べるつもり? 行や列の数が不定だった場合にどうすればいいと思う?

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

読み返してみたら #1 の最初の文は誤解を生みそうな気がするので変更. 上の for の部分は忘れてしまって, #2 でいわれるような 3重ループに直しちゃってください (補足ありがとうございます>#2).

Nya-22
質問者

お礼

回答ありがとうございます。 まだ一般的になぜダメかすぐにわからないです 汗 まずは三重ループをがんばってみます!。

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.2

#1さんの回答に補足します。 #1さんが3重ループと書かれているのは、 i行目の処理  j列目の処理   積のi行j列の要素は、「掛けられる行列のi行k列 * 掛ける行列のk行j列」の和 という意味です。

Nya-22
質問者

お礼

回答ありがとうございます。三重ループで作ってみます!

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

mc に積を求めている上の 2つの for文と, 求めた mc を表示している下の 2つの for 文の違いをじっくりと見てください. でも, 「行列の積」を求めるときには普通 3重ループにするものだよ. 今の場合は「たまたま」 2行 2列だからいいかもしれないけど, 一般的にはダメなことは理解できるよね?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語で行列の積を計算できるような関数を作って疑問に思ったことがありま

    C言語で行列の積を計算できるような関数を作って疑問に思ったことがあります。 まず↓のような2x3行列と3x2行列が計算できる関数を作りました、、 #include <stdio.h> void mul(const int ma[2][3],const int mb[3][2],int mc[2][2]) { int i,j,k; for(i = 0; i < 2; i++) for(j = 0;j < 2;j++) for(k=0;k<3;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) { int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) { for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n'); } eturn(0); } ---------------------------------- これをmxn,nxp行列で計算できるような関数にしたいと思い 下のようにしたのですがエラーになります。どうしたらいいでしょうか・・? #include <stdio.h> void mul(const int ma[int m][int n],const int mb[int n][int p],int mc[m][p]) { int i,j,k; for(i=0;i<m;i++) for(j=0;j<p;j++) for(k=0;k<n;k++) mc[i][j]+=ma[i][k]*mb[k][j]; } int main(void) {int i,j; int ma[2][3] ={{1,2,3},{4,5,6}}; int mb[3][2] ={{7,8},{9,0},{1,2}}; int mc[2][2] ={0}; mul(ma,mb,mc); for(i = 0;i < 2; i++) {for(j = 0;j < 2;j++) printf("%4d",mc[i][j]); putchar('\n');} return(0);}

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

  • 行列の和のプログラミング

    以下のをCソースを打ち込んでコンパイルすると、 warning: passing arg 1 of `mat_add' from incompatible pointer type warning: passing arg 2 of `mat_add' from incompatible pointer type となります。これは、どういうエラーでどう直せばいいのでしょうか? #include <stdio.h> void mat_add(const int ma[2][3], const int mb[2][3], int mc[2][3]) { int i, j; for (i = 0; i < 2; i++) for (j = 0; j < 3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i, j; int ma[2][3] = { {10, -5, 4}, {18, -2, -18} }; int mb[2][3] = { {23, 16, -9}, {-3, 20, 5} }; int mc[2][3] = { 0 }; mat_add(ma, mb, mc); for (i = 0; i < 2; i++) { for (j = 0; j < 3; j++) printf("%3d", mc[i][j]); putchar('\n'); } return (0); }

  • 2次元配列の基礎について

    とある問題で 下に示す行列x,yの積を求めるプログラムを作成せよ。 x=[123][456] y=[15] [53][81] 問題の意味が自分にはよくわからないのですが この場合 123*15;123*53;123*81 456*15;456*53;456*81 の解答を表示させればいいのでしょうか? 自分でやったら以下のようになりましたが、これだと456*53と123*15と0しか表示されません。どこをどう直せば宜しいでしょうか? ご教授お願いしますm(__)m #include <stdio.h> int main(void){ int ma[3][1] ={{123},{456}}; int mb[3][1] ={{15},{53},{81}}; int mc[3][1] ={0}; int i; int j; for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ mc[i][j] =ma[i][j] * mb[i][j]; } } for(i=0;i <= 3;i++){ for(j=0;j <= 1;j++){ printf("%3d",mc[i][j]); putchar('\n'); } } return 0; }

  • C言語 行列の和

    C言語 行列の和 ご覧いただき有難うございます。 久しぶりにC言語の復習をしようと簡単な行列の計算を書いてみたのですが、思うような結果になりませんでした。 昨日から考えていたのですが、どこに間違いがあるのか発見できませんでした。 アドバイス等宜しくお願いいたします。 >環境 OS:Windows XP(32bit),Windows 7(64bit) コンパイラ:Visual Studio C++ 2010 Express (付属のコマンドプロンプ使用) >期待する結果 7 5 7 9 6 8 >出力された結果 7 8 0 0 0 0 >ソースコード #include <stdio.h> int main(void){ int i,j, ma[2][3] = {(1,2,3),(4,5,6)}, mb[2][3] = {(6,3,4),(5,1,2)}, mc[2][3] = {0}; for(i=0;i<2;i++){ for(j=0;j<3;j++){ mc[i][j] = ma[i][j] + mb[i][j]; } } for(i=0;i<2;i++){ for(j=0;j<3;j++){ printf("%3d",mc[i][j]); } putchar('\n'); } return (0); }

  • c言語 行列の積に関して

    <問>  4行3列の行列aと3行4列の行列bの積を、4行4列の行列cに格納する関数を作成せよ。  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) 入門レベルのスキルしかありません。 上手く行列の積のプログラムが組めません。 行列の積の計算結果が何も出てきません。 どの様にしたら良いかご指導の程、宜しくお願いします。 <プログラム>  void mat_mul(const int a[4][3], const int b[3][4], int c[4][4]) { int i, j, k; for (i = 0; i < 4; k++) { for (j = 0; j < 4; i++) for (k = 0; k < 3; j++) c[i][j] = c[i][j] + (a[i][k] * b[k][j]); } } void mat_print(const int m[4][4]) { for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) printf("%4d", m[i][j]); putchar('\n'); } } int main(void) { int i, j ,k; int tensu1[4][3]; int tensu2[3][4]; int seki[4][4]; for(i = 0; i < 4; i++) { for (j = 0; j < 3; j++) { scanf("%d", &tensu1[i][j]); } putchar('\n'); } for(i = 0; i < 3; i++) { for(j = 0; j < 4; j++){ scanf("%d", &tensu2[i][j]); } putchar('\n'); } putchar('\n'); mat_mul(tensu1, tensu2, seki); puts("行列の積"); mat_print(seki); return 0; }  

  • 行列の積について

    3行3列の行列AとB、およびその和と積を表示するものです #include <stdio.h> int main (void) { int i,j,k; double a[3][3] = {{2.4, 5.5, -8.5},{0.8, 3.7, 1.1},{3.5, -9.1, 2.6}}; double b[3][3] = {{-5.1, 9.8, 2.3},{-4.1, 0.2, -0.3},{3.3, 6.1, -1.3}}; double c[3][3] = {0}; printf(" 行列A\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) printf("%5.1f", a[i][j]); printf("\n"); } printf("\n 行列B\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) printf("%5.1f", b[i][j]); printf("\n"); } printf("\n 行列A+B\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) c[i][j] = a[i][j] + b[i][j]; } for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%5.1f", c[i][j]); printf("\n"); } for (i=0; i<3 ; i++){ for (j=0; j<3; j++) for (k=0; k<3; k++) c[i][j] =c[i][j]+ a[i][k]* b[k][j]; } printf("\n 行列AB\n"); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) printf("%7.2f", c[i][j]); printf("\n"); } return 0; } これだと積だけが異なった値が出てしまいます。 試しに、積の部分だけで組んでみると正しい答えが出ました。 for文のブロックの組み方がまずいのかなと思っていますが、これ以外だと、行列のレイアウトが崩れてしまいます どのように直したらいいのか、ご教示お願いします

  • 多次元配列の受渡しでの警告

    多次元配列を関数に受け渡す際に、 警告: passing argument 1 of ‘mat_add’ from incompatible pointer type 警告: passing argument 2 of ‘mat_add’ from incompatible pointer type のような警告が出てきてしまいます。 プログラムは、明解C言語(柴田望洋著)で紹介されているサンプルプログラムなのですが(下に載せておきます)、どうしてこのような警告がでるのか分からず困っています。 多次元配列の渡し方になにか問題があるのでしょうか? #include <stdio.h> void mat_add(const int ma[][3], const int mb[][3], int mc[][3]) { int i,j; for(i=0; i<2; i++) for(j=0; j<3; j++) mc[i][j] = ma[i][j] + mb[i][j]; } int main(void) { int i,j; int ma[2][3] = {{9,2,-3},{4,5,1}}; int mb[2][3] = {{9,2,-3},{4,5,1}}; int mc[2][3] = {0}; mat_add(ma, mb, mc); for(i=0; i<2; i++){ for(j=0; j<3; j++) printf("%3d",mc[i][j]); putchar('\n'); } return(0); }

  • 行列の積を関数を使って求める・・?

    2つの行列の行と列を入力し、積を計算するプログラムを関数を使って書きたいのですが、上手く行きません。どこをどのように直したらよいか教えてください!お願いします!! 以下が私が書いたプログラムです。 #include<stdio.h> #define NUMBER 10 int first(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; do{ printf("2つの行列の行と列を入力してください\n"); scanf("%d", &x1); scanf("%d", &x2); scanf("%d", &y1); scanf("%d", &y2); if(x1 != y2){ printf("行列の積は計算できません\n"); } }while(x1 != y2); printf("行列Aの要素を入力してください\n"); for(i=0; i<x1; i++){ for(j=0; j<x2; j++) scanf("%d", &a[i][j]); } printf("行列Bの要素を入力してください\n"); for(j=0; j<y1; j++){ for(k=0; k<y2; k++) scanf("%d", &b[j][k]); } } int second(int x1,int x2,int y1,int y2,int i,int j,int k) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; for(i=0; i<x1; i++){ for(k=0; k<y2; k++){ for(j=0; j<x2; j++) c[i][k] = c[i][k] + a[i][j]*b[j][k]; } } for(i=0; i<x2; i++){ for(k=0; k<y2; k++) printf("%3d", c[i][k]); printf("\n"); } } int main(void) { int a[NUMBER][NUMBER] = {0}; int b[NUMBER][NUMBER] = {0}; int c[NUMBER][NUMBER] = {0}; printf("行列の積を計算します\n %d\n", first(x1,x2,y1,y2,i,j,k)); printf("行列Aと行Bの積は\n %3d",second(x1,x2,y1,y2,i,j,k)); }

  • C言語 行列の積

    行列の積をfor文を使って計算したいです。 #include<stdio.h> int main(void){ int x[2][2]={{1,3},{2,4}}; int y[1][2]={3,2}; int xy[1][2]; int i, j, k; for (i = 0; i < 1; i++) { for (j = 0; j < 2; j++) { xy[i][j] = 0; for (k = 0; k < 2; k++) { xy[i][j] += x[i][k] * y[k][j]; } } } xの二行目の計算からできません。 プログラムの修正をお願いします。