行列の積

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ykneu

行列の積

#1

投稿記事 by ykneu » 9年前

行列の(AB)^2を表せません。ABをもとめることはできました。

#include<stdio.h>
#define N 4
#define M 5

int main(void){
double A[N][M]={{2,4,3,1,1},{1,0,0,1,1},{2,6,0,1,1},{1,1,1,1,1}};
double B[N][M]={{1,1,1,1,1},{2,0,9,1,1},{6,1,4,1,1},{1,1,1,1,1}};
double c;
int a,b,k;
int x,y;

printf("行列A\n");
for(x=0;x<N;x++){
for(y=0;y<M;y++){
printf("%f ",A[x][y]);
}
printf("\n");
}
printf("\n");

printf("行列B\n");
for(x=0;x<N;x++){
for(y=0;y<M;y++){
printf("%f ",B[x][y]);
}
printf("\n");
}
printf("\n");


printf("A*B");
printf("\n");
for(a=0;a<N;a++){
for(b=0;b<M;b++){
c=0;
for(k=0;k<N;k++){
c=c+A[a][k]*B[k];
}
printf("%f ",c);
}
printf("\n");
}

return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 行列の積

#2

投稿記事 by みけCAT » 9年前

ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
ykneu さんが書きました:行列の(AB)^2を表せません。ABをもとめることはできました。
それは大変ですね。
何か質問はありますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 行列の積

#3

投稿記事 by かずま » 9年前

ykneu さんが書きました:行列の(AB)^2を表せません。ABをもとめることはできました。

#include<stdio.h>
#define N 4
#define M 5

int main(void){
double A[N][M]={{2,4,3,1,1},{1,0,0,1,1},{2,6,0,1,1},{1,1,1,1,1}};
double B[N][M]={{1,1,1,1,1},{2,0,9,1,1},{6,1,4,1,1},{1,1,1,1,1}};
4行5列の行列と 5行4列の行列を掛けて 4行4列の行列にするか、
5行4列の行列と 4行5列の行列を掛けて 5行5列の行列にすることはできても、
4行5列の行列と 4行5列の行列を掛けることはできません。

ykneu

Re: 行列の積

#4

投稿記事 by ykneu » 9年前

#include<stdio.h>
#define N 4
#define M 5

int main(void){
double A[N][M]={{2,4,3,1,1},{1,0,0,1,1},{2,6,0,1,1},{1,1,1,1,1}};
double B[M][N]={{1,1,1,1},{2,0,9,1},{6,1,4,1},{1,1,1,1}{3,2,4,1}};

失礼いたしました。上記のとおりに訂正お願いします。

かずま

Re: 行列の積

#5

投稿記事 by かずま » 9年前

あなたの使っている Cコンパイラは何ですか?

C99 なら、関数の引数に可変長配列が使えるので、次のように書けます。

コード:

#include <stdio.h>

#define N  4
#define M  5

void print(int n, int m, double a[n][m])
{
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++)
            printf(" %4g", a[i][j]);
        printf("\n");
    }
}

void mul(int n, int m, double a[n][m], double b[m][n],  double c[n][n])
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
            double t = 0;
            for (int k = 0; k < m; k++)
                t += a[i][k] * b[k][j];
            c[i][j] = t;
        }
}

int main(void)
{
    double A[N][M] = {
        { 2, 4, 3, 1, 1 },
        { 1, 0, 0, 1, 1 },
        { 2, 6, 0, 1, 1 },
        { 1, 1, 1, 1, 1 },
    };
    double B[M][N] = {
        { 1, 1, 1, 1 },
        { 2, 0, 9, 1 },
        { 6, 1, 4, 1 },
        { 1, 1, 1, 1 },
        { 3, 2, 4, 1 },
    };
    double C[N][N], D[N][N];

    puts("A:"); print(N, M, A);
    puts("B:"); print(M, N, B);
    mul(N, M, A, B, C);
    puts("AB:"); print(N, N, C);
    mul(N, N, C, C, D);
    puts("(AB)^2:"); print(N, N, D);
    return 0;
}
実行結果

コード:

A:
    2    4    3    1    1
    1    0    0    1    1
    2    6    0    1    1
    1    1    1    1    1
B:
    1    1    1    1
    2    0    9    1
    6    1    4    1
    1    1    1    1
    3    2    4    1
AB:
   32    8   55   11
    5    4    6    3
   18    5   61   10
   13    5   19    5
(AB)^2:
 2197  618 5372  981
  327  101  722  142
 1829  519 4931  873
  848  244 1999  373
gcc なら、-std=c99 オプションでコンパイル。
Microsoft Visual C++ なら 2013以降でしょう。

ykneu

Re: 行列の積

#6

投稿記事 by ykneu » 9年前

私が使っているのはgccです!

閉鎖

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