【问题标题】:How can I transpose my Matrix to reverse columns and rows?如何转置矩阵以反转列和行?
【发布时间】:2021-10-10 15:31:22
【问题描述】:

我设法输入 M,N,并接受它的条件(0

最后一个是转置,我看过一些网站,但由于它们的方式与我的不同,所以我不喜欢只是“直接”复制粘贴。

这是我的代码:

#include <stdio.h>

int main()
{
int M, N, i, j;

printf ("Enter number M: ");
scanf("%d", &M);
printf ("Enter number N: ");
scanf("%d", &N);

if (0 < N && M <= 10) {
    printf ("Accepted number M: %d\n", M);
    printf("Accepted number N: %d\n", N);
}
else printf("Please enter valid number, which is 0 < N and M <= 10!");

int matrixA[M][N], matrixB[M][N], matrixC[M][N];

printf ("Enter matrix A: \n");

for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         scanf("%d", &matrixA[i][j]);
                        }
}

printf ("Enter matrix B: \n");

for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         scanf("%d", &matrixB[i][j]);
                        }
}

printf("Matrix A: \n");
for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         printf("%d ", matrixA[i][j]);
                        }
printf("\n");
}

printf("Matrix B: \n");
for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         printf("%d ", matrixB[i][j]);
                        }
printf("\n");
}

for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         matrixC[i][j] = matrixA[i][j] + matrixB[i][j];
                        }
}

printf("Sum of matrix A and matrix B => Matrix C is: \n");
for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         printf("%d ", matrixC[i][j]);
                        }
printf("\n");
}

int reverseMatrixC[N][M];
for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         reverseMatrixC[j][i] = matrixC[i][j];
                        }
}
printf("Reverse columns and rows in matrix C: \n");
for (i=0; i<M; i++){
   for (j=0; j<N; j++){
         printf("%d ", reverseMatrixC[i][j]);
                        }
printf("\n");
}
}

最后一个“反向列和行”是错误的,我不知道为什么,从我的思维方式来说,我正在切换M和N,然后将之前的矩阵C应用到一个新的变量中,即reverseMatrixC,然后把 i 和 j 颠倒过来。

例如,我选择 M = 2,N = 3。 然后我选择 matrixA 和 matrixB 这些值:

1 2 3
4 5 6

矩阵C将显示:

2 4 6
8 10 12

但是当我转置它时,它会显示:

2 8 4
4 10 6

我想要的是这样的:

2 8
4 10
6 12

【问题讨论】:

  • 如果用户输入的数字超出范围,您会打印出错误,然后继续执行程序,就好像没有问题一样。如果输入验证失败,您需要一个循环返回输入提示。此外,您只检查N 的下限和M 的上限也很奇怪。您不应该检查两个值的两个界限吗?就目前而言,N 可能很大,M 可能是否定的,您的验证将通过。
  • 是的,这就是我在最后一步时的想法,我也尝试切换M和N,并注意到这一点,但我想不出任何正确的解决方案现在,我几天前刚刚学会了如何使用 Array :D.
  • 您有N 导致堆栈溢出的危险;在这种情况下,您需要测试NM 的下限和上限;那是 4 个谓词。

标签: c


【解决方案1】:

你很亲密。事实上,你正确地转置了matrixC,唯一的问题是你如何打印出来:

printf("Reverse columns and rows in matrix C: \n");
// reverseMatrixC has its rows and columns dimensions swapped, so N specifies its number of rows
for (i=0; i<N; i++){
    // and M specifies its number of columns
    for (j=0; j<M; j++){
            printf("%d ", reverseMatrixC[i][j]);
    }
    printf("\n");
}

还强烈建议您修复缩进并使用为您格式化的 IDE,它使阅读代码更加容易。

Demo

【讨论】:

  • 谢谢你的帮助,你的看起来很干净漂亮,但我不明白为什么我们必须#define M 2 和 N 3 然后必须定义 int matrixA[M] [N] = { {1,2,3}, {4,5,6} } 再次。无论如何,我们可以随意输入吗?如果您不能为我解释这部分,我只想了解:D 再次感谢 :)
  • @MeowMeowpram 不要注意 #defines 和初始化列表数组。我这样做只是为了我。在调试这样的问题时,对所有值进行硬编码而不是每次都输入它们会更容易和更快地进行调试。我根本不建议将您的代码部分替换为最终解决方案。但这是一种需要注意的调试技术。你想尽可能地隔离问题。问题在于转置,而不是输入。我展示的硬编码只是通过消除用户输入来节省时间。
  • @MeowMeowpram 例如,您的部分验证(仍需要一些工作)接受M 最多10 个。假设N 的大小可能相同,则需要输入 矩阵的 100 个值。如果您知道输入代码正在工作,您真的想在每次运行以进一步调试代码中的问题时输入 100 个值吗?我不会。相反,您可以通过硬编码矩阵暂时绕过该步骤,以便稍后专注于问题。一旦解决了这个问题(当然是在你提交作业之前!),恢复用户输入。
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-11
  • 2013-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多