【问题标题】:My algorithm for transposing matrix only works on certain dimensions我的转置矩阵算法仅适用于某些维度
【发布时间】:2021-11-25 22:19:59
【问题描述】:

基本上,我已经编写了一些代码来转置一个矩阵,并且对于某些输入它可以工作,对于某些它不能,我不知道我在哪里犯了错误。

这是代码

#include <stdio.h>

int main() {
  int WIDTH, HEIGHT, i, j;
  int matrix[100][100];
  do {
    printf("Enter height and width: ");
    scanf("%d %d", &HEIGHT, &WIDTH);
    if ((WIDTH > 100 || HEIGHT > 100) || (WIDTH < 1) || (HEIGHT < 1))
      printf("Dimensions incorrect!\n");
    else
      break;
  } while (1);

  int vel = WIDTH * HEIGHT;

  printf("Enter elements: ");
  for (i = 0; i < HEIGHT; i++)
    for (j = 0; j < WIDTH; j++)
      scanf("%d", &matrix[i][j]);

  int temp;
  for (i = 0; i < HEIGHT; i++) {
    for (j = i; j < WIDTH; j++) {
      temp = matrix[i][j];
      matrix[i][j] = matrix[j][i];
      matrix[j][i] = temp;
    }
  }

  printf("Transposed matrix: \n");
  for (i = 0; i < WIDTH; i++) {
    for (j = 0; j < HEIGHT; j++)
      printf("%5d", matrix[i][j]);
    printf("\n");
  }

  return 0;
}

我对维度 3 2,元素 {1,2,3,4,5,6} 的输出:(示例 1)

1    3    0
2    4    0

想要的输出:(示例 1)

1    3    5
2    4    6

我对维度 5 1、元素 {1,2,3,4,5} 的输出: (示例 2)

1    0    0    0    0

想要的输出:(示例 2)

1    2    3    4     5

【问题讨论】:

    标签: c matrix transpose


    【解决方案1】:

    考虑 5,1 的情况,所以:

      for (i = 0; i < 5; i++) {
        for (j = i; j < 1; j++) { // for j>=1 the condition will always fail
          temp = matrix[i][j];
          matrix[i][j] = matrix[j][i];
          matrix[j][i] = temp;
        }
      }
    

    内部循环的主体只会运行[0][0]

    该循环仅在HEIGHT&lt;=WIDTH 时有效。如果HEIGHT&gt;=WIDTH,你应该这样做:

      for (i = 0; i < HEIGHT; i++) {
        for (j = 0; j < i; j++) {
          temp = matrix[i][j];
          matrix[i][j] = matrix[j][i];
          matrix[j][i] = temp;
        }
      }
    

    换句话说,如果矩阵是不对称的,您希望交换次数基于其较长的一边。

    如果 HEIGHT==WIDTH,你可以做任何一个。

    【讨论】:

    • 是的,先生,这确实有效,没想到那个。非常感谢:)。
    猜你喜欢
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多