【问题标题】:What's wrong with this code for multiplying two matrices in C?这段代码在 C 中将两个矩阵相乘有什么问题?
【发布时间】:2020-06-01 14:31:14
【问题描述】:

matrixMultiplier 函数的目的是将A * B 相乘,然后显示结果矩阵C,对于任意两个方阵ABAB 大小受 10*10 限制。

当询问用户他们希望引入的矩阵的大小时,虽然AB10*10,但该函数仅适用于 A 和 B 中的子矩阵,直到用户拥有的维度指定,例如3*3

我已经通过将3*3 单位矩阵自身相乘进行了测试,但它没有给我正确的答案。

#include <stdio.h>

void matrixMultiplier(int A[][10], int B[][10], int C[][10], int n) {
    int i, j, k;
    for (i = 0; i < n; i++) {
        for (k = 0; k < n; k++) {
            C[i][k] = 0;               /* Initialize output matrix to zero */
        }
    }

    for (i = 0; i < n; i++) {
        for (k = 0; k < n; k++) {
            for (j = 0; j < n; j++) {
                C[i][k] += A[i][j] * B[j][k];
            }
        }
    }
    printf("\n");

    for (i = 0; i < n; i++) {
        for (k = 0; k < n; k++) {
            printf("%4d", C[i][k]);
        }
        printf("\n");
    }
}
     
int main(void) {
    int A[][10] = {{0}};
    int B[][10] = {{0}};
    int C[][10] = {{0}}; /* Initialize output matrix to zero */
    int i, j;
    int n;

    printf("Enter square matrix dimension: ");
    scanf("%d", &n);
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Assign a value: ");
            scanf("%d", &A[i][j]);
        }
        printf("New row.\n");
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%4d", A[i][j]);
        }
        printf("\n");
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("Assign a value: ");
            scanf("%d", &B[i][j]);
        }
        printf("New row.\n");
    }
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf("%4d", B[i][j]);
        }
        printf("\n");
    }
    matrixMultiplier(A, B, C, n);
    return 0;
}

【问题讨论】:

  • int A[][10] = {{0}}int A[1][10] - 这是您的代码可以使用的唯一矩阵大小。
  • 外尺寸为1
  • 尝试使用内存清理器运行,例如在 clang 中:-fsanitize=memory -fno-omit-frame-pointer

标签: c matrix-multiplication


【解决方案1】:

你需要像这样使用静态分配的数组:

 int A[10][10] = {{0}};
 int B[10][10] = {{0}};
 int C[10][10] = {{0}};  /* Initialize output matrix to zero */

正如其他评论员所注意到的,在 C 中 int A[][10] = {{0}}; 基本上等同于 int A[1][10] = {{0}};,因此只有第一行被正确设置。

【讨论】:

    【解决方案2】:

    看看这个代码:

    #include <stdio.h>
    #define MAX_SIZE 10
    
    void matrixMultiplier(int A[][MAX_SIZE], int B[][MAX_SIZE], int C[][MAX_SIZE], int n)
    {
     int i, j, k;
    
     for (i = 0; i < n; i++)
       for (k = 0; k < n; k++)
         for (j = 0; j < n; j++)
           C[i][k] += A[i][j] * B[j][k];
    
     printf("\nProduct Matrix C:\n\n");
        for(i = 0; i < n; ++i)
        {
            for(j = 0; j < n; ++j)
                printf("%4d", C[i][j]);
            putchar('\n');
        }
    }
    
    int main(void)
    {
        //int A[][10] = {{0}}; By initializing like this you are creating this int A[1][10] = {{0}};
        int A[MAX_SIZE][MAX_SIZE] = {0};
        int B[MAX_SIZE][MAX_SIZE] = {0};
        int C[MAX_SIZE][MAX_SIZE] = {0};
        int i, j, n;
    
        printf("Enter square matrix dimension: ");
        scanf("%d", &n);
    
        printf("Input %d values row-wise, for matrix A: ", n*n);
        for(i = 0; i < n; ++i)
            for(j = 0; j < n; ++j)
                scanf("%d", &A[i][j]);
    
        printf("Input %d values row-wise, for matrix B: ", n*n);
        for(i = 0; i < n; ++i)
            for(j = 0; j < n; ++j)
                scanf("%d", &B[i][j]);
    
        printf("\nGiven Matrix A:\n\n");
        for(i = 0; i < n; ++i)
        {
            for(j = 0; j < n; ++j)
                printf("%4d", A[i][j]);
            putchar('\n');
        }
    
        printf("\nGiven Matrix B:\n\n");
        for(i = 0; i < n; ++i)
        {
            for(j = 0; j < n; ++j)
                printf("%4d", A[i][j]);
            putchar('\n');
        }
    
       matrixMultiplier(A, B, C, n);
       return 0;
    }
    

    如果您需要更多关于二维数组的说明,请参阅link

    【讨论】:

    • 没有解释的代码不是答案。仅提供解释是不够的,部分原因是 Stack Overflow 不是个人调试服务,而是旨在成为问题和答案的持久存储库以供将来参考,并且您不会在这里无限期地解释未来。
    猜你喜欢
    • 1970-01-01
    • 2014-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2018-01-21
    相关资源
    最近更新 更多