Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何有效地更新特征稀疏矩阵项_C++_Sparse Matrix_Linear Algebra_Eigen - Fatal编程技术网

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;
...