雅可比迭代法法
在图形图像中不少地方用到求矩阵的特征值和特征向量,好比主成分分析、OBB包围盒等。编程时通常都是用数值分析的方法来计算,这里介绍一下雅可比迭代法求解特征值和特征向量。雅可比迭代法的原理,网上资料不少,详细可见参考资料1。这里咱们简单介绍求解矩阵S特征值和特征向量的步骤:ios
初始化特征向量为对角阵V,即主对角线的元素都是1.其余元素为0。
在S的非主对角线元素中,找到绝对值最大元素 Sij。
用下 式计算tan2θ,求 cosθ、sinθ 及旋转矩阵Gij 。
用下面公式求S‘;用当前特征向量矩阵V乘以矩阵Gij获得当前的特征向量V。
若当前迭代前的矩阵A的非主对角线元素中最大值小于给定的阈值e时,中止计算;不然, 令S =S‘, 重复执行(2) ~ (5)。 中止计算时,获得特征值 li≈(S‘) ij ,i,j= 1,2,…,n.以及特征向量V。
这一步可选。根据特征值的大小从大到小的顺序从新排列矩阵的特征值和特征向量。
代码实现
用C++实现,并与参考资料1示例对比。web
#include
#include
#include
#include
using namespace std;
/**
* @brief Jacobi eigenvalue algorithm
* @param matrix n*n array
* @param dimdim represent n
* @param eigenvectorsn*n array
* @param eigenvaluesn*1 array
* @param precision precision requirements
* @param maxmax number of iterations
* @return
*/
bool Jacobi(double* matrix, int dim, double