C++ 如何有效地更新特征稀疏矩阵项
我有一个固定的稀疏矩阵,在计算之前通过以下方式设置:C++ 如何有效地更新特征稀疏矩阵项,c++,sparse-matrix,linear-algebra,eigen,C++,Sparse Matrix,Linear Algebra,Eigen,我有一个固定的稀疏矩阵,在计算之前通过以下方式设置: Eigen::SparseMatrix<double, Eigen::ColMajor> A; std::vector<Eigen::Triplet<double>> coefficients{ {0, 0}//, {,},{,},{,} }; A.setFromTriplets(coefficients.begin(), coefficients.end()); A.makeCompressed(
Eigen::SparseMatrix<double, Eigen::ColMajor> A;
std::vector<Eigen::Triplet<double>> coefficients{
{0, 0}//, {,},{,},{,}
};
A.setFromTriplets(coefficients.begin(), coefficients.end());
A.makeCompressed();
我得到的是二进制搜索,而不是高效的常数时间访问
我可以使用
valuePtr()
,但它似乎有点“黑客化”。一种方法是使用迭代器并使用迭代器更新条目:
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());
请注意,这是一个以列为主的稀疏矩阵,因此它是快速的j
和慢速的i
。手动填充系数需要记住这一事实
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;
...