行列乗算演算

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ワニ
記事: 4
登録日時: 3年前

行列乗算演算

#1

投稿記事 by ワニ » 3年前

こんにちは、
今学校の課題で行列乗算演算のプログラムを書いています。
    
2 3
1 2 3           Invalid calculation!! (2*3 2*1の計算)               
4 5 6           4 2        (2*3 3*2の計算の答え)  
2 1            10 5            
1
0
2 3
1 2 3
4 5 6
3 2
1 0
0 1
1 0
左の数字を入力して右の答えを出力しなきゃいけないんですが、そこのコードを上手くかけません。
下に書いてあるプログラムは2*3×3*2のプログラムです。この式も論理的に合っているかわからないのでアドバイスいただけませんでしょうか。
よろしくお願いします。

#include<stdio.h>

int main(){
{
int A[2][3],B[3][2],C[2][2];
int tmp[2][2]; //answer
int i,j,k;

/* caliculate */
for(i=0; i<2; i++){
for(j=0; j<2; j++){
tmp[j] = 0;
for(k=0; k<3; k++)tmp[j] += A[k]*B[k][j];
}
}

/* result copy to C*/
for(i=0; i<2; i++)
for(j=0; j<2; j++)
C[j] = tmp[j];

}

return 0;
}

アバター
あたっしゅ
記事: 663
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 行列乗算演算

#2

投稿記事 by あたっしゅ » 3年前

今回の学校の課題は

2 3 // 行列 X[2][3]
1 2 3
4 5 6
2 1 // 行列 Y[2][1]
1
0
2 3 // 行列 A[2][3]
1 2 3
4 5 6
3 2 // 行列 B[3][2]
1 0
0 1
1 0


行列 X * 行列 Y // (2*3 2*1の計算)               
Invalid calculation!!

行列 A * 行列 B // (2*3 3*2の計算の答え)  
4 2
10 5            

ということで、よろしいのでしょうか ?
「2*3×3*2」で検索したところ、

http://zhi-ma.hatenablog.com/entry/2013/10/07/155149
2行3列の行列と3行2列の行列の積を求めるプログラム - プログラミング+α学習ブログ(ja)

と出ました。

コード:

#include <stdio.h>

/*--- 2行3列の行列maと3行2列の行列mbの積にmcに格納する ---*/
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++) {
            mc[i][j] = 0;
            for (k = 0; k < 3; k++)
                mc[i][j] += ma[i][k] * mb[k][j];
        }
}

int main(void)
{
    int i, j;
    int A[2][3] = { {1, 2, 3}, {4, 5, 6} };
    int B[3][2] = { {1, 0}, {0, 1}, {1, 0} };
    int z[2][2];
    
    mul(A, B, z);
    
    for (i = 0; i < 2; i++) {
        for (j = 0; j < 2; j++)
            printf("%3d", z[i][j]);
        putchar('\n');
    }
    
    return (0);
}


// end.
https://www.onlinegdb.com/ で処理した結果、

4 2
10 5

と出ました。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

ワニ
記事: 4
登録日時: 3年前

Re: 行列乗算演算

#3

投稿記事 by ワニ » 3年前

2 3 // 行列 X[2][3]
1 2 3
4 5 6
2 1 // 行列 Y[2][1]
1
0
2 3 // 行列 A[2][3]
1 2 3
4 5 6
3 2 // 行列 B[3][2]
1 0
0 1
1 0


行列 X * 行列 Y // (2*3 2*1の計算)               
Invalid calculation!!

行列 A * 行列 B // (2*3 3*2の計算の答え)  
4 2
10 5            

そうです!こんな感じです!
ありがとうございます!だけど、
23
123
456......の式をプログラムに直接入れるのではなくて、プログラムを書いたあとプログラムの実行時に自分で入力しなくてはいけないです...
どう書けばいいのでしょうか..
ありがとうございます

box
記事: 2002
登録日時: 13年前

Re: 行列乗算演算

#4

投稿記事 by box » 3年前

プログラムの実行時に自分で入力しなくてはいけないです...
所定回数ループを回して、その中でscanf()
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

返信

“C言語何でも質問掲示板” へ戻る