我用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中建议的剪枝方法有效但我只需要暂时将非对角线元素设置为零,修剪似乎实际上删除它们会减慢程序的不同部分。
在这种情况下我该如何处理?
提前致谢!
编辑:我忘了说清楚:稀疏矩阵已经填充了值。
答案 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)
。