如何有效地更新特征稀疏矩阵项

马修·布鲁彻(Matthieu Brucher)

我有一个固定的稀疏矩阵,在通过以下操作进行计算之前就已经建立了:

Eigen::SparseMatrix<double, Eigen::ColMajor> A;
std::vector<Eigen::Triplet<double>> coefficients{
    {0, 0}//, {,},{,},{,}
};
A.setFromTriplets(coefficients.begin(), coefficients.end());
A.makeCompressed();

现在,我需要用我的实际条目进行更新。不幸的是,浏览以下条目:

for(...) A.coeffRef(i,j) = new_val(i,j);

我得到了二进制搜索,而不是有效的恒定时间访问。

我可以使用valuePtr(),但似乎有点“ hacky”。

马修·布鲁彻(Matthieu Brucher)

一种方法是使用迭代器并使用它们更新条目:

for (int k=0; k<A.outerSize(); ++k)
  for (SparseMatrix<double>::InnerIterator it(A,k); it; ++it)
    it.valueRef() = new_val(it.row(), it.col());

就我而言,我可以展开循环并手动填充代码中的每个条目:

A.coeffs()[0] = new_val_0;
A.coeffs()[1] = new_val_1;
A.coeffs()[2] = new_val_2;
...

请注意,这是一个以列为主的稀疏矩阵,所以它快j而慢i手工填充系数需要牢记这一事实。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章