我的转置矩阵算法仅适用于某些维度

My algorithm for transposing matrix only works on certain dimensions

基本上,我已经编写了一些代码来转置矩阵,并且对于某些输入有效,对于某些输入无效,我不知道我在哪里犯了错误。

这是代码

#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

考虑 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;
    }
  }

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

该循环仅在 HEIGHT<=WIDTH 时有效。如果 HEIGHT>=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,你可以做任何一个。