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