如何有效地更新特征稀疏矩阵条目
How to efficiently update Eigen sparse matrix entries
我有一个固定的稀疏矩阵,我在计算之前通过以下方式设置:
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"。
一种方法是使用迭代器并用它们更新条目:
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
。手动填充系数需要牢记这一事实。
我有一个固定的稀疏矩阵,我在计算之前通过以下方式设置:
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"。
一种方法是使用迭代器并用它们更新条目:
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
。手动填充系数需要牢记这一事实。