【问题标题】:Transpose Matrix Using Pointer in C在 C 中使用指针转置矩阵
【发布时间】:2019-07-21 21:32:34
【问题描述】:

我正在做使用指针转置矩阵的任务。我的代码可以成功转置矩阵的第一行,但无法转置其他行和列。我怀疑 for 循环存在一些问题,但我找不到问题所在。以下是我的代码。

void transposeMatrix(int matrix[ROWS][COLS]){
    int**  transpose=(int **)malloc(ROWS*sizeof(int*));
    for(int  i=0; i< ROWS; i++)
        transpose[i]=(int*)malloc(COLS*sizeof(int));

    for(int  i=0; i<ROWS;i++){
        puts("");
        for(int  j=0; j<COLS;j++){
            *(transpose+i*ROWS+j)= *(matrix+j*COLS+i);
            printf("%d ",transpose[j][i]);
        }
        puts("");
    }
}

矩阵生成随机数,问题如下:

Original Matrix:
10 20 30
40 50 60
70 80 90

Transpose Matrix:
10 0 43009213
20 3401401 910429
30 0 134910124

我无法附上图片,所以上面只是对我遇到的问题的阐述,实际情况并不完全如此,但非常相似。

感谢您的帮助!

【问题讨论】:

  • 很好奇,为什么代码在int** transpose=(int **)malloc(ROWS*sizeof(int*));(int*) 中使用(int **) 转换(int*)malloc(COLS*sizeof(int))
  • *(transpose+i*ROWS+j)= *(matrix+j*COLS+i) 正在分配一个指针。你确定要那个?
  • @chux 你是想说don't cast malloc吗?
  • 您正在分配给transpose[i][j],但您正在打印transpose[j][i]
  • @Barmar 我尝试将它们翻转过来,但问题仍然存在。我不明白这些奇怪的数字是从哪里来的以及如何解决它们。我对 C 语言和指针真的很陌生,所以我现在很困惑。

标签: c pointers matrix


【解决方案1】:

*(transpose+i*ROWS+j) 不是访问指针数组元素的正确方法。这是访问二维数组的方法,该数组以行优先顺序连续存储在 int[] 数组中或通过 int* 指针。

访问实现为指针数组的二维数组元素的方法是使用*(*(transpose + i)+j)*(transpose + i) 返回指向行 i 的指针,将 j 添加到返回行中第 j' 列的地址,然后引用获取或设置值。

这也适用于声明为的数组

int matrix[ROWS][COLS];

因为数组衰减为指针的方式。

所以你的作业应该是:

        *(*(transpose + i)+j) = *(*(matrix + j)+i);

然后您需要更改printf() 行,因为它没有打印您刚刚分配的相同元素。应该是:

        printf("%d ", transpose[i][j]);

完整的工作函数是:

void transposeMatrix(int matrix[ROWS][COLS]){
    int**  transpose=(int **)malloc(ROWS*sizeof(int*));
    for(int  i=0; i< ROWS; i++)
        transpose[i]=(int*)malloc(COLS*sizeof(int));

    for(int  i=0; i<ROWS;i++){
        puts("");
        for(int  j=0; j<COLS;j++){
            *(*(transpose + i)+j) = *(*(matrix + j)+i);
            printf("%d ",transpose[i][j]);
        }
        puts("");
    }
}

【讨论】:

    【解决方案2】:

    您在识别每个单元格的行和列的内存位置时遇到问题 以下是使用它们的方法:

    i-th rows of transpose = *(transpose + i)
    j-th col in i-th row of transpose  = *(*(transpose+i) + j)
    

    类似于矩阵:

    i-th rows of matrix= *(matrix + i)
    j-th col in i-th row of matrix  = *(*(matrix+i) + j)
    

    所以这是我的解决方案:

    void transposeMatrix(int matrix[ROWS][COLS]) {
        int**  transpose = (int **)malloc(ROWS * sizeof(int*));
        for (int i = 0; i < ROWS; i++)
            transpose[i] = (int*)malloc(COLS * sizeof(int));
    
        for (int i = 0; i < ROWS; i++) {
            puts("");
            for (int j = 0; j < COLS; j++) {
                *(*(transpose + i) + j) = *(*(matrix + j) + i);
                printf("%d ", transpose[i][j]);
            }
            puts("");
        }
    }
    

    【讨论】:

      【解决方案3】:

      您不必逐行分配新矩阵。此外,执行转置和打印的函数可以直接传递int *,而不是像int [3][2] 等预成形数组。

      甚至可以就地重塑矩阵(即不分配新空间)。如果你喜欢我可以稍后发布示例代码。

      例如:

      #include <stdio.h>
      #include <stdlib.h>
      #include <memory.h>
      
      int M[2][3] = { {1, 2, 3}, {7, 8, 9} };
      int N[3][3] = { {1, 2, 3}, { 4, 5, 6 }, {7, 8, 9} };
      
      
      int *alloc_transpose(const int *matrix, size_t rows, size_t cols);
      void print_matrix(const int *matrix, size_t rows, size_t cols);
      
      int main()
      {
          int *t_matrix;
          print_matrix(&M[0][0], 2, 3);
      fprintf(stderr, "----\n");
          t_matrix = alloc_transpose(&M[0][0], 2, 3);
          if (t_matrix) {
              print_matrix(t_matrix, 3, 2);
          }
          free(t_matrix);
          t_matrix = alloc_transpose(&N[0][0], 3, 3);
          if (t_matrix) {
          fprintf(stderr, "----\n");
              print_matrix(t_matrix, 3, 3);
          }
          free(t_matrix);
          return 0;
      }
      
      void print_matrix(const int *matrix, size_t rows, size_t cols)
      {
          size_t r, c;
          for (r = 0; r < rows; r++) {
              for (c = 0; c < cols; c++) {
                  printf("%d ", *((matrix + r * cols) + c));
              }
              putchar('\n');
          }
      }
      
      int *alloc_transpose(const int *matrix, size_t rows, size_t cols)
      {
          int *tm;
          int r, c;       /* relative to transposed matrix */
      
          tm = malloc(sizeof(int) * cols * rows); /* contiguous is okay */
      
          if (!tm)
              return NULL;
      
          for (r = 0; r < rows; r++) {
              for (c = 0; c < cols; c++) {
                  *((tm + c * rows) + r) =
                                *((matrix + r * cols) + c);
              }
          }
      
          return tm;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        相关资源
        最近更新 更多