如何在C++中借助Eigen库计算左特征向量?
用Eigen计算矩阵的左特征向量
左特征向量的定义是满足 ( vX = \lambda v ) 的行向量 ( v ),其中 ( \lambda ) 是对应的特征值。利用线性代数性质,这个等式等价于 ( X^T v^T = \lambda v^T )——也就是说左特征向量的转置,就是原矩阵转置后的右特征向量。基于这个性质,你可以用Eigen按以下步骤计算左特征向量:
具体实现步骤
- 对原矩阵做转置操作:
Eigen::MatrixXd X_T = X.transpose(); - 用
EigenSolver求解转置矩阵的特征值和右特征向量:Eigen::EigenSolver<Eigen::MatrixXd> X_T_eigen(X_T); - 将转置矩阵的右特征向量矩阵整体转置,得到原矩阵的左特征向量矩阵(每行对应一个左特征向量):
Eigen::MatrixXd left_eigenvectors = X_T_eigen.eigenvectors().transpose();
完整示例代码
#include <Eigen/Dense> #include <iostream> int main() { // 示例矩阵 Eigen::MatrixXd X(2, 2); X << 1, 2, 3, 4; // 原矩阵的右特征向量(常规计算) Eigen::EigenSolver<Eigen::MatrixXd> X_eigen(X); std::cout << "右特征向量:\n" << X_eigen.eigenvectors() << "\n\n"; // 计算左特征向量 Eigen::MatrixXd X_T = X.transpose(); Eigen::EigenSolver<Eigen::MatrixXd> X_T_eigen(X_T); Eigen::MatrixXd left_eigenvectors = X_T_eigen.eigenvectors().transpose(); std::cout << "左特征向量:\n" << left_eigenvectors << "\n"; std::cout << "对应特征值:\n" << X_T_eigen.eigenvalues() << "\n"; return 0; }
注意事项
- 转置矩阵的特征值和原矩阵的特征值完全一致,所以直接使用转置矩阵求解器的
eigenvalues()即可,无需额外处理。 - Eigen返回的特征向量矩阵默认按列存储右特征向量,转置后就会得到按行存储的左特征向量,每个行向量对应一个特征值。
内容的提问来源于stack exchange,提问作者Gwaine
相关产品推荐
相关产品推荐

