如何在Eigen的ColPivHouseholderQR分解中获取Pivot矩阵?
提取ColPivHouseholderQR中的置换矩阵P
Eigen的ColPivHouseholderQR类提供了直接获取列置换矩阵的方法,对应的接口是colsPermutation()——它返回一个PermutationMatrix对象,这是Eigen对置换矩阵的高效存储形式,你可以直接将其转换为普通稠密矩阵(比如MatrixXd)得到公式中的P。
代码示例
#include <Eigen/Dense> #include <iostream> int main() { // 定义示例矩阵A Eigen::MatrixXd A(3, 3); A << 1, 2, 3, 4, 5, 6, 7, 8, 9; // 执行带列主元的QR分解 Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qr(A); // 获取置换矩阵P(先得到PermutationMatrix,再转成稠密矩阵) Eigen::MatrixXd P = qr.colsPermutation(); // 验证:A*P 是否等于 Q*R Eigen::MatrixXd Q = qr.householderQ(); Eigen::MatrixXd R = qr.matrixQR().triangularView<Eigen::Upper>(); std::cout << "A*P:\n" << A * P << "\n\n"; std::cout << "Q*R:\n" << Q * R << "\n"; return 0; }
关键说明
colsPermutation()返回的PermutationMatrix内部仅存储置换的索引,比普通矩阵更节省内存和计算资源。如果只是用于矩阵乘法等操作,直接用PermutationMatrix即可,无需转换;如果需要显式的矩阵形式,再转成MatrixXd或其他稠密矩阵类型。- 注意公式
A*P = Q*R中,P是列置换矩阵,对应列的重排操作。colsPermutation()返回的就是这个矩阵,不需要额外的转置或调整。
内容的提问来源于stack exchange,提问作者Hamed
相关产品推荐
相关产品推荐

