-3

在 matlab 中删除零行或列很容易,但我在当前的 c 代码中遇到了这个问题,我必须删除所有零行和列以使我的求解器更快。我找不到任何简单的方法。你能以任何方便的方式帮助我吗?

4

2 回答 2

1

简单的方法是逐行遍历,然后逐列遍历,检查是否为零,如果为真,则将该行/列替换为最后一个并删除最后一个(free(),如果它是动态的和 m-- 或 n--如果是静态的)

于 2012-05-16T04:25:21.743 回答
1

删除前导和尾随行和列

我们可以实现一种矩阵方式,使这些操作相当有效。

您分配一个大块来保存最大数量的数据,就好像它是一个 2D 数组 ( [][]),然后执行

typedef struct {
   size_t aJ;      /* Allocated row length. Needed for computing positions */
   size_t uI, uJ;  /* Number of row/cols in use currently. For range checking */
   size_t oI, oJ;  /* Offset to the start of the first used row/col */
   double *matrixA /* the storage */
} MatrixT;

您将需要编写初始化和清理例程。老 c 手会注意到我们可以在这里使用数组技巧(或漂亮的新可变长度成员工具)

访问元素 (i,j) 类似于

double* element(MatrixT*this, size_t i, size_t j) {
  double* base = this->matrixA + oI*aJ + oJ;
  /* range checking if desired */
  return (base + i*aJ + j);
}

这具有从普通二维数组访问元素的复杂性大约两倍的复杂性,并且可以以稍微清晰为代价简化为单行(但您的编译器可能会为您执行此操作)。

删除行和列涉及减少适当的“使用值”以及适当的“偏移”值(如果您从前面获取它)。

因为该结构比普通的旧 2D 数组更复杂并且需要更多的簿记,所以您需要将所有操作都包含在函数中。


老 Fortran77 程序员可能会认为这是对 “将连续子数组传递给函数”习语的重新实现。

于 2012-05-17T15:11:58.170 回答