0

我正在尝试开发 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;
}
4

0 回答 0