【问题标题】:Transposing a matrix in-place using the "follow-the-cycles" algorithm使用“follow-the-cycles”算法就地转置矩阵
【发布时间】:2021-12-31 02:06:44
【问题描述】:

我正在尝试实现"follow-the-cycles" 算法以就地转置矩阵。矩阵以行优先顺序存储在数组中。我还使用布尔数组来跟踪访问过的位置。这是我目前所拥有的:

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

void print_matrix(const int *mtx, int rows, int columns)
{
  for (int i = 0; i < rows; ++i)
  {
    for (int j = 0; j < columns; ++j)
    {
      printf("%2d ", mtx[(i * columns) + j]);
    }

    printf("\n");
  }
}

void transpose_matrix(int *mtx, int rows, int columns)
{
  int size = rows * columns;
  bool *visited = malloc(sizeof (bool) * size);

  // ...

  free(visited);
}

int main(void)
{
  enum { ROWS = 4, COLUMNS = 3 };
  int mtx[ROWS * COLUMNS] = {
     1,  2,  3,
     4,  5,  6,
     7,  8,  9,
    10, 11, 12
  };

  printf("Original:\n");
  print_matrix(mtx, ROWS, COLUMNS);

  printf("\nTransposed:\n");
  transpose_matrix(mtx, ROWS, COLUMNS);
  print_matrix(mtx, ROWS, COLUMNS);

  return 0;
}

我不太了解伪代码的某些部分,所以我无法实现它。

【问题讨论】:

    标签: c matrix


    【解决方案1】:

    这个想法是首先找到一个未转置的循环。这是布尔数组为假的任何位置p。然后计算转置位置q,将值暂时保存在那里a[q],将a[p]复制到a[q],相应地更新布尔数组,然后将p设置为q并使用上次临时保存的值重复直到q 被证明已经被转置。

    这意味着您已经到达周期的终点。去寻找下一个。在代码中,这意味着您将有一个外部循环在 bool 数组中搜索错误值,而内部循环则遍历循环。

    当 bool 数组完全为真时,你就完成了。

    如果矩阵是方阵,则所有循环的长度为 2。矩形数组将具有更长的循环。

    要实现这一点,您必须能够从/到线性数组位置“解码”和“编码”行/列索引对(i,j)。如果数组以行主要顺序存储,则解码为p = i * n_cols + j。编码为i(p) = p / n_colsj(p) = p % n_cols

    例如,如果p 还没有转置,你会得到它的转置位置

    q = j(p) * n_cols + i(p) = (p % n_cols) * n_cols + p / n_cols
    

    我不会破坏你剩下的乐趣。

    【讨论】:

      猜你喜欢
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-13
      • 2017-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多