Eigen SparseMatrix - 设置行值

时间:2014-08-13 16:38:50

标签: c++ sparse-matrix eigen

我用Eigen编写了一个模拟,现在我需要设置一个ColumnMajor SparseMatrix的行列表,如下所示:

In row n: 
  for column elements m:
    if m == n set value to one
    else set value to zero

稀疏矩阵中始终存在列index = row index的元素。我尝试使用InnerIterator,但由于我有一个ColumnMajor矩阵,因此效果不佳。在https://stackoverflow.com/a/21006998/3787689中建议的剪枝方法有效但我只需要暂时将非对角线元素设置为零,修剪似乎实际上删除它们会减慢程序的不同部分。

在这种情况下我该如何处理?

提前致谢!

编辑:我忘了说清楚:稀疏矩阵已经填充了值。

3 个答案:

答案 0 :(得分:0)

使用三元组进行有效插入:

const int N = 5;
const int M = 10;
Eigen::SparseMatrix<double> myMatrix(N,M); // N by M matrix with no coefficient, hence this is the null matrix

std::vector<Eigen::Triplet<double>> triplets;

for (int i=0; i<N; ++i) {
    triplets.push_back({i,i,1.});
}

myMatrix.setFromTriplets(triplets.begin(), triplets.end());

答案 1 :(得分:0)

我这样解决了:因为我想坚持使用ColumnMajor矩阵,所以我会使用本地RowMajor版本并使用InnerIterator将值分配给特定的行。之后,我用结果覆盖我的矩阵。

Eigen::SparseMatrix<float, Eigen::RowMajor> rowMatrix;
rowMatrix = colMatrix;
for (uint i = 0; i < rowTable.size(); i++) {
  int rowIndex = rowTable(i);
  for (Eigen::SparseMatrix<float, Eigen::RowMajor>::InnerIterator 
           it(rowMatrix, rowIndex); it; ++it) {
    if (it.row() == it.col())
      it.valueRef() = 1.0f;
    else
      it.valueRef() = 0.0f;
  }
}
colMatrix = rowMatrix;

答案 2 :(得分:0)

对于初学者来说,将行/列/块设置为零的最简单方法是将其乘以0.0。

因此以您希望的方式修补整行就足够了:

A.row(n) *= 0;         //Set entire row to 0
A.coeffRef(n,n) = 1;   //Set diagonal to 1

这样,您无需根据RowMajor / ColMajor订单更改代码。 Eigen将快速完成所有工作。

此外,如果您真的对将行设置为0后释放内存感兴趣,请在完成矩阵中的所有行编辑后再添加A.prune(0,0)