「関数を使って」か…。
#include <stdio.h>
#include <stdlib.h>
void getXT(int **x, int **xt, int m, int n);
void calcXTX(int **x, int **xt, int **xtx, int m, int n);
void dispX(int **x, int m, int n);
int main(void){
int m, n;
int **x, **xt, **xtx;
int i, j, k;
printf("m: ");
scanf("%d", &m);
printf("n: ");
scanf("%d", &n);
x = (int**)malloc(sizeof(int*) * m);
for(i = 0; i < m; i++){
x[i] = (int*)malloc(sizeof(int) * n);
}
xt = (int**)malloc(sizeof(int*) * n);
xtx = (int**)malloc(sizeof(int*) * n);
for(i = 0; i < n; i++){
xt[i] = (int*)malloc(sizeof(int) * m);
xtx[i] = (int*)malloc(sizeof(int) * n);
}
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
printf("x[%d][%d] = ", i, j);
scanf("%d", &x[i][j]);
}
}
getXT(x, xt, m, n);
calcXTX(x, xt, xtx, m, n);
printf("\nX\n");
dispX(x, m, n);
printf("\nXT\n");
dispX(xt, n, m);
printf("\nXT X\n");
dispX(xtx, n, n);
return 0;
}
void getXT(int **x, int **xt, int m, int n){
int i, j;
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
xt[j][i] = x[i][j];
}
}
}
void calcXTX(int **x, int **xt, int **xtx, int m, int n){
int i, j, k;
for(i = 0; i < n; i++){
for(j = 0; j < n; j++){
xtx[i][j] = 0;
for(k = 0; k < m; k++){
xtx[i][j] += xt[i][k] * x[k][j];
}
}
}
}
void dispX(int **x, int m, int n){
int i, j;
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
printf("%d ", x[i][j]);
}
printf("\n");
}
}
ー 実行結果 ー
m: 2
n: 3
x[0][0] = 1
x[0][1] = 2
x[0][2] = 3
x[1][0] = 2
x[1][1] = 3
x[1][2] = 4
X
1 2 3
2 3 4
XT
1 2
2 3
3 4
XT X
5 8 11
8 13 18
11 18 25