【问题标题】:How to efficiently update Eigen sparse matrix entries如何有效地更新特征稀疏矩阵条目
【发布时间】:2018-12-06 21:29:13
【问题描述】:

我有一个固定的稀疏矩阵,我在计算之前设置了:

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”。​​

【问题讨论】:

    标签: c++ sparse-matrix linear-algebra eigen


    【解决方案1】:

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

    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。手动填充系数需要牢记这一事实。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 2016-10-09
      • 1970-01-01
      • 2020-12-07
      • 2023-03-29
      • 2019-05-26
      • 1970-01-01
      • 2015-08-24
      • 1970-01-01
      相关资源
      最近更新 更多