如何在Eigen中无需显式构造转置稀疏矩阵实现高效向量乘法?
高效计算Eigen中AᵀAx的正确姿势(无需显式构造Aᵀ或AᵀA)
你提到的A.transpose()会显式构造转置矩阵是误解——Eigen对稀疏矩阵的转置操作默认返回的是一个轻量级的转置表达式对象,而非实际复制所有非零元素生成的新矩阵。只有当你把A.transpose()赋值给一个独立的SparseMatrix变量时,才会触发显式构造。
基于这个特性,你可以通过两步稀疏矩阵-向量乘法完成计算,全程无需显式构造Aᵀ或AᵀA:
#include <Eigen/Sparse> using namespace Eigen; int main() { SparseMatrix<double> A; VectorXd x; // 假设A和x已正确初始化 // 第一步:计算中间向量y = Ax VectorXd y = A * x; // 第二步:计算最终结果 = Aᵀ * y,利用转置表达式,无额外内存开销 VectorXd result = A.transpose() * y; return 0; }
关键细节说明
- 转置表达式
A.transpose()仅存储原矩阵的引用和转置标记,内存占用可以忽略 - 两步乘法都是稀疏矩阵与稠密向量的运算,效率远高于先构造稠密的AᵀA再乘x(毕竟AᵀA密度远高于A)
- 即使直接写链式表达式
A.transpose() * A * x,Eigen也会通过表达式模板优化,避免显式构造Aᵀ或AᵀA,但分两步写更直观,也方便调试中间结果
内容的提问来源于stack exchange,提问作者Daniel Langr
相关产品推荐
相关产品推荐

