c++ - Eigen 库中的稀疏稀疏积 A^T*A 优化

标签 c++ matrix-multiplication eigen3

在多个相同矩阵matA的情况下,比如

matA.transpose()*matA, 

您不必计算所有结果乘积,因为结果矩阵是对称的(因此仅当 m>n 时),在我的特定情况下始终是对称的!正方形。

因此,仅用于计算就足够了。前任。下三角部分和其余部分仅复制.....因为多个第 2 行和第 3 行的结果 resp.col 与第 3 行和第 2 行相同......等等......

所以我的问题是,存在如何告诉 Eigen 的方法,只计算较低的部分。并可选择仅保存到产品的下部 trinaguler 部分?

    DATA = SparseMatrix<double>((SparseMatrix<double>(matA.transpose()) * matA).pruned()).toDense();

最佳答案

根据documentation ,您可以计算矩阵的下三角:

m1.triangularView<Eigen::Lower>() = m2 + m3;

或者在你的情况下:

m1.triangularView<Eigen::Lower>() = matA.transpose()*matA;

(它说“写入特定的三角形部分:(仅评估引用的三角形部分)”)。否则,在你写的那一行 Eigen会计算整个稀疏矩阵matA.transpose()*matA .

关于保存结果 m1矩阵,它与保存任何类型的矩阵相同( Eigen::MatrixXtEigen::SparseMatrix<t> )。如果m1是稀疏的,那么它将只有一个简单 matA.transpose()*matA 大小的一半.如果m1是稠密的,则为满方阵。

关于c++ - Eigen 库中的稀疏稀疏积 A^T*A 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30784501/

相关文章:

c++ - 返回 Eigen::Ref 是否合法?

c++ - 在 Eigen c++ 中,如何将 NxM 矩阵的每一行乘以 Nx1 标量的 vector ?

c++ - push_back(move(struct.unique_ptr)) 导致编译错误

c++ - 在 Windows 中更改原始波形数据的音高

c++ - 在 -fsanitize=address 下运行时如何抑制 LeakSanitizer 报告?

非 const 字符串的 C++ lambda 到 std::function 错误

python - 将 n 个 3x3 旋转矩阵的数组与 3 个向量的 3d 数组相乘

c++ - 将代码从 Eigen2 移植到 Eigen3 时的奇怪行为

c++ - 如何在它之外的模板类中使用模板参数?

c# - Make efficient - 在 c# 中使用两个向量的对称矩阵乘法