假设Eigen C++库中的SparseMatrix类型

SparseMatrix<double, RowMajor> A;

似乎缺少使用InnerIterator或double *作为返回类型的coeffFind(i,j)方法。因此,要确保A在位置(i,j)处不存在非零系数,我可以
A.coeffRef(i,j) = 0.0;  // Adds an entry with zero value!

要么
if (A.coeff(i,j) != 0.0) {
  A.coeffRef(i,j) = 0.0;  // Double look-up cost!
}

或编写我自己的查找方法,该方法将复制本征内部使用的二进制搜索。我该怎么办?

最佳答案

如果性能很关键(足够重要),我会自己写。否则,仅基于复杂度:

  • 查找为O(log(nnz))
  • 插入(O(1)或O(nnz),取决于插入位置-如果矩阵被压缩,则还保留更多内存)

  • 因此,对于第二个选项,成本始终为O(nnz),对于第一个选项,成本始终为O(log(nnz))(如果没有元素)。如果有一个元素,则在任何情况下成本都将是O(log(nnz))的两倍,因此,相对于第二种方法中的插入,您节省的O(log(nnz))不会很重要。如果确实很关键,请自己编写。

    09-06 22:40