#include <stdio.h>
#include <string.h>
void Rec_Mult(int *C, const int *A, const int *B, int n, int rowsize)
{
if (n == 2)
{
const int d11 = 0;
const int d12 = 1;
const int d21 = rowsize;
const int d22 = rowsize + 1;
C[d11] += A[d11] * B[d11] + A[d12] * B[d21];
C[d12] += A[d11] * B[d12] + A[d12] * B[d22];
C[d21] += A[d21] * B[d11] + A[d22] * B[d21];
C[d22] += A[d21] * B[d12] + A[d22] * B[d22];
}
else
{
const int d11 = 0;
const int d12 = n / 2;
const int d21 = (n / 2) * rowsize;
const int d22 = (n / 2) * (rowsize + 1);
// C11 += A11 * B11
Rec_Mult(C + d11, A + d11, B + d11, n / 2, rowsize);
// C11 += A12 * B21
Rec_Mult(C + d11, A + d12, B + d21, n / 2, rowsize);
// C12 += A11 * B12
Rec_Mult(C + d12, A + d11, B + d12, n / 2, rowsize);
// C12 += A12 * B22
Rec_Mult(C + d12, A + d12, B + d22, n / 2, rowsize);
// C21 += A21 * B11
Rec_Mult(C + d21, A + d21, B + d11, n / 2, rowsize);
// C21 += A22 * B21
Rec_Mult(C + d21, A + d22, B + d21, n / 2, rowsize);
// C22 += A21 * B12
Rec_Mult(C + d22, A + d21, B + d12, n / 2, rowsize);
// C22 += A22 * B22
Rec_Mult(C + d22, A + d22, B + d22, n / 2, rowsize);
}
}
#define ROW_COUNT 8
void printMatrix(const char *name, const int *mat)
{
printf("%s:\n", name);
for (int i = 0; i < ROW_COUNT; ++i)
{
for (int j = 0; j < ROW_COUNT; ++j)
{
printf("%4d", mat[i * ROW_COUNT + j]);
}
printf("\n");
}
printf("\n");
}
int main()
{
const int matA[ROW_COUNT * ROW_COUNT] =
{
1, 2, 3, 0, 0, 4, 5, 6,
1, 2, 3, 0, 0, 4, 5, 6,
1, 2, 3, 0, 0, 4, 5, 6,
1, 2, 3, 0, 0, 4, 5, 6,
1, 2, 3, 0, 0, 4, 5, 6,
1, 2, 3, 0, 0, 4, 5, 6,
1, 2, 3, 0, 0, 4, 5, 6,
1, 2, 3, 1, 1, 4, 5, 6,
};
const int matB[ROW_COUNT * ROW_COUNT] =
{
2, 2, 2, 2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3, 3,
0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 0, 0, 0, 0, 0, 2,
4, 0, 0, 0, 0, 0, 0, 2,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1,
};
int matC[ROW_COUNT * ROW_COUNT];
memset(matC, 0, sizeof(matC));
Rec_Mult(matC, matA, matB, ROW_COUNT, ROW_COUNT);
printMatrix("Matrix A", matA);
printMatrix("Matrix B", matB);
printMatrix("Multiply", matC);
return 0;
} |