c++ - 在 Eigen 中计算 SparseMatrix 1-范数、Inf-范数的有效方法

标签 c++ sparse-matrix eigen eigen3

在 Eigen 库中,我知道有 visitorsreductions 用于密集的 Eigen::Matrix 类,我可以有效地使用它们来计算他们的 1-norm, inf-norm, etc. 是这样的:

Eigen::MatrixXd A;
...
A.colwise().lpNorm<1>().maxCoeff();
A.rowwise().lpNorm<1>().maxCoeff();
// etc.

现在我有了稀疏 Eigen::SparseMatrix 类。在这种情况下,我如何有效地计算这些范数?

最佳答案

您可以使用带有 vector 1 的乘积来计算 colwise/rowwise 1-范数:

(Eigen::RowVectorXd::Ones(A.rows()) * A.cwiseAbs()).maxCoeff();
(A.cwiseAbs() * Eigen::VectorXd::Ones(A.cols()).maxCoeff();

检查生成的程序集,看看它是否针对您的目的进行了充分优化。如果没有,或者如果您需要其他 lpNorm,您可能需要编写两个带有稀疏迭代器的嵌套循环。

关于c++ - 在 Eigen 中计算 SparseMatrix 1-范数、Inf-范数的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42874976/

相关文章:

c++ - 未记录的 C++ 预处理器指令 (MSVC 2013u4)

c++ - (int *) (&a[2]) 和 *(&a[2]) 之间的区别

r - 为什么在大型稀疏矩阵上的 R 行提取比将其分成较小的部分然后提取时要慢?

python - Scipy 稀疏矩阵 - 密集向量乘法性能 - block 与大型矩阵

c++ - 比较 Google Test 或 Google Mock 中的特征矩阵

cmake - 为 CMake 查找包 Eigen3

c++ - 将 lambda 表达式或函数保存到二进制文件

c++ - 无法使用 Xerces-C++ 解析 XML

algorithm - 如何在线性时间和(希望)次线性空间中检测稀疏数据的分区(集群)?

c++ - 使用 Eigen 以欧拉角旋转四元数