我找到了这个fortran90代码,该代码使用Jacobi算法查找了实对称矩阵的特征值和特征向量。我了解一般概念,但是我不明白有3-4行。
下面是一段代码:
1 do while (b2.gt.abserr)
2 do i=1,n-1
3 do j=i+1,n
4 if (a(j,i)**2 <= bar) cycle ! do not touch small elements
5 b2 = b2 - 2.0*a(j,i)**2
6 bar = 0.5*b2/float(n*n)
7 ! calculate coefficient c and s for Givens matrix
8 beta = (a(j,j)-a(i,i))/(2.0*a(j,i))
9 coeff = 0.5*beta/sqrt(1.0+beta**2)
10 s = sqrt(max(0.5+coeff,0.0))
11 c = sqrt(max(0.5-coeff,0.0))
因此,b2
定义为非对角线条目的平方和; abserr
是精度的阈值; bar
是另一个阈值,用于获取我们要清零的绝对值的最大条目,而a(i,j)
是初始矩阵的条目。
我不理解的是 9 , 10 和 11 < / strong>。在我阅读或观看的所有课程,视频,pdf等中,此处的系数coeff
(大多数时间 t )从来没有这样定义。相反,它的定义类似于t = 1.0/(abs(beta) + sqrt(beta**2 + 1.0))
,如果beta
为负,则t = -t
。因此,我也不确定 10 和 11 行,因为{{1} }和c
与s
相关。
如果有人知道对称矩阵的Jacobi特征值方法并理解上面的代码,我将不胜感激。