C++ Eigen库中Diagonal对象无法调用inverse()的编译问题及求逆方法
在Eigen中高效求对角矩阵的逆矩阵
你的代码编译失败是因为Eigen::Diagonal是一个轻量级的表达式视图,不是完整的矩阵类型,它并没有提供inverse()成员函数。Eigen针对对角矩阵的逆运算有内置的高效实现,不需要手动写循环,下面是两种简便方法:
方法一:直接对对角视图逐元素求逆并转为对角矩阵
利用cwiseInverse()完成逐元素取倒数,再通过asDiagonal()转为对角矩阵:
Eigen::MatrixXd A = /* 你的矩阵初始化 */; Eigen::MatrixXd D_inv = A.diagonal().asDiagonal().cwiseInverse();
如果只需要存储逆矩阵的对角元素向量(不需要完整矩阵),可以直接对对角向量调用cwiseInverse():
Eigen::VectorXd diag_inv = A.diagonal().cwiseInverse();
方法二:先提取对角向量,再求逆并转为对角矩阵
这种方式更直观,适合需要单独处理对角元素的场景:
Eigen::MatrixXd A = /* 你的矩阵初始化 */; Eigen::VectorXd diag_elements = A.diagonal(); Eigen::MatrixXd D_inv = diag_elements.cwiseInverse().asDiagonal();
为什么这些方法高效?
Eigen的cwiseInverse()是专门针对向量、对角结构优化的逐元素操作,不会触发通用矩阵求逆的复杂计算(比如LU分解),完全符合你对高效计算的需求。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

