行列の(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;
}
行列の積
Re: 行列の積
ソースコードを提示する際は、BBCodeを有効にした(無効にしない)状態でcodeタグで囲んでいただけると、見やすくてありがたいです。
何か質問はありますか?
それは大変ですね。ykneu さんが書きました:行列の(AB)^2を表せません。ABをもとめることはできました。
何か質問はありますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 行列の積
4行5列の行列と 5行4列の行列を掛けて 4行4列の行列にするか、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}};
5行4列の行列と 4行5列の行列を掛けて 5行5列の行列にすることはできても、
4行5列の行列と 4行5列の行列を掛けることはできません。
Re: 行列の積
あなたの使っている Cコンパイラは何ですか?
C99 なら、関数の引数に可変長配列が使えるので、次のように書けます。
実行結果
gcc なら、-std=c99 オプションでコンパイル。
Microsoft Visual C++ なら 2013以降でしょう。
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
Microsoft Visual C++ なら 2013以降でしょう。