Files
suanfa/c/ch2/matrix/macheng.c
T
2026-06-14 23:48:44 +08:00

94 lines
2.8 KiB
C

#include <stdio.h>
#include <stdlib.h>
#define N 2 // 矩阵大小
void matrix_multiply(int A[][N], int B[][N], int C[][N])
{
int i, j, k;
if (N == 1) {
C[0][0] = A[0][0] * B[0][0];
return;
} else {
int A11[N / 2][N / 2], A12[N / 2][N / 2], A21[N / 2][N / 2], A22[N / 2][N / 2];
int B11[N / 2][N / 2], B12[N / 2][N / 2], B21[N / 2][N / 2], B22[N / 2][N / 2];
int C11[N / 2][N / 2], C12[N / 2][N / 2], C21[N / 2][N / 2], C22[N / 2][N / 2];
int P[N / 2][N / 2], Q[N / 2][N / 2], R[N / 2][N / 2], S[N / 2][N / 2],
T[N / 2][N / 2], U[N / 2][N / 2], V[N / 2][N / 2];
// 将矩阵分成4个小矩阵
for (i = 0; i < N / 2; i++) {
for (j = 0; j < N / 2; j++) {
A11[i][j] = A[i][j];
A12[i][j] = A[i][j + N / 2];
A21[i][j] = A[i + N / 2][j];
A22[i][j] = A[i + N / 2][j + N / 2];
B11[i][j] = B[i][j];
B12[i][j] = B[i][j + N / 2];
B21[i][j] = B[i + N / 2][j];
B22[i][j] = B[i + N / 2][j + N / 2];
}
}
// 求7个小矩阵
matrix_multiply(A11, B11, P);
matrix_multiply(A12, B21, Q);
matrix_multiply(A11, B12, R);
matrix_multiply(A12, B22, S);
matrix_multiply(A21, B11, T);
matrix_multiply(A22, B21, U);
matrix_multiply(A21, B12, V);
// 根据公式计算四个子矩阵
for (i = 0; i < N / 2; i++) {
for (j = 0; j < N / 2; j++) {
C11[i][j] = P[i][j] + Q[i][j];
C12[i][j] = R[i][j] + S[i][j];
C21[i][j] = T[i][j] + U[i][j];
C22[i][j] = V[i][j] + P[i][j] - R[i][j] + T[i][j];
}
}
// 将四个子矩阵合并成一个大矩阵
for (i = 0; i < N / 2; i++) {
for (j = 0; j < N / 2; j++) {
C[i][j] = C11[i][j];
C[i][j + N / 2] = C12[i][j];
C[i + N / 2][j] = C21[i][j];
C[i + N / 2][j + N / 2] = C22[i][j];
}
}
}
}
int main()
{
int A[N][N] = {{1, 2}, {3, 4}};
int B[N][N] = {{5, 6}, {7, 8}};
int C[N][N];
int i, j;
matrix_multiply(A, B, C);
printf("矩阵A:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", A[i][j]);
}
printf("\n");
}
printf("矩阵B:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", B[i][j]);
}
printf("\n");
}
printf("矩阵C:\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", C[i][j]);
}
printf("\n");
}
return 0;
}