我正在尝试开发 strassen 的矩阵乘法程序,程序只是从第一次在 matrix_mul() 函数中调用 malloc 时停止它的执行 谁能解释问题是什么?
我尝试调试代码并在 for 循环中调用 malloc 函数之前添加 printf() ,并在 for 循环之后添加 printf() 。
我正在尝试以递归方式进行。代码尚未完全完成,但我只是检查其他一切是否正常,但我遇到了这个问题。
#include <stdio.h>
#include<stdlib.h>
#define pfm(a,n) for (int i = 0; i < n; ++i){printf("\nrow %d:",i);for (int j = 0; j < n; ++j)printf("%d",a[i][j]);}
#define sfm(a,n) for (int i = 0; i < n; ++i)for (int j = 0; j < n; ++j)scanf("%d",&a[i][j]);
#define debug(x) printf("debugging x = %d",x);
int **matrix_add(int n, int **mat1, int **mat2) {
int **x;
for (int i = 0; i < n; ++i)
{
x[i] = malloc(sizeof(int *) * n);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
x[i][j] = mat1[i][j] + mat2[i][j];
}
}
pfm(x, n)
return x;
}
int **matrix_mul(int n, int matrix1[n][n] , int matrix2[n][n]) {
int a[n / 2][n / 2], b[n / 2][n / 2], c[n / 2][n / 2], d[n / 2][n / 2];
int e[n / 2][n / 2], f[n / 2][n / 2], g[n / 2][n / 2], h[n / 2][n / 2];
int **new;
//divide matrix into 4 matrix for both matrix total 8 matrix a to h
printf("Assigning memory.....\n");
for (int i = 0; i < n; ++i)
{
new[i] = malloc(sizeof(int *) * n);
}
printf("Done\nn=%d\n", n );
if (n == 1) {
new[0][0] = matrix1[0][0] + matrix2[0][0];
printf("Base");
return new;
}
for (int i = 0; i < n / 2; ++i)
{
for (int j = 0; j < n / 2; ++j)
{
//matrix1
a[i][j] = matrix1[i][j];
b[i][j] = matrix1[i][j + n / 2];
c[i][j] = matrix1[i + n / 2][j];
d[i][j] = matrix1[i + n / 2][j + n / 2];
//matrix2
e[i][j] = matrix2[i][j];
f[i][j] = matrix2[i][j + n / 2];
g[i][j] = matrix2[i + n / 2][j];
h[i][j] = matrix2[i + n / 2][j + n / 2];
}
}
for (int i = 0; i < n / 2; ++i)
{
for (int j = 0; j < n / 2; ++i)
{
new[i][j] = matrix_add(n / 2, matrix_mul(n / 2, a, e), matrix_mul(n / 2, a, e))[i][j];
}
}
pfm(new, n);
// [a, b] [e, f]
// [c, d] * [g, h]
// [ae + bg, af + bh]
// [ce + dg, cf + dh]
return new;
}
int main(int argc, char const *argv[])
{
int n, **result;
printf("Enter the matrix size:\n");
scanf("%d", &n);
int matrix1[n][n], matrix2[n][n];
sfm(matrix1, n);
sfm(matrix2, n);
result = matrix_mul(n, matrix1, matrix2);
pfm(result, n);
// pfm(matrix, n);
return 0;
}