如何在C编程中删除矩阵的零行和零列

时间:2012-05-16 04:11:34

标签: c matrix

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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手会注意到我们可以在这里使用数组技巧(或spiffy new variable length member facility)

访问元素(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阵列的元素访问复杂性的两倍,并且可以以一点点清晰度为代价简化为单行(但您的编译器可能会为您做到这一点)。

删除行和列包括减少相应的“使用值”以及从前面获取适当的“偏移”值。

因为结构比普通的旧2D阵列更复杂,需要更多的簿记,所以你需要在函数中包含所有操作。


旧的Fortran77程序员可能会认识到这是将一个连续的子数组传递给函数习惯用法的重新实现。