Dată rotație - în algebra liniară , un operator liniar pentru rotirea unui vector cu un unghi dat .
Matricea Givens are următoarea formă:
Această matrice diferă de matricea de identitate doar prin submatrice
situate pe rânduri și coloane cu numere și . Este ortogonală.
Dacă este dat un vector , atunci alegând
cos ϕ = A k A k 2 + A l 2 {\displaystyle \cos {\phi }={\frac {a_{k}}{\sqrt {a_{k}^{2}+a_{l}^{2))))} păcat ϕ = − A l A k 2 + A l 2 {\displaystyle \sin {\phi }={\frac {-a_{l}}{\sqrt {a_{k}^{2}+a_{l}^{2)}))}puteți seta a treia componentă a vectorului la zero :
[ cos ϕ − păcat ϕ păcat ϕ cos ϕ ] [ A k A l ] = [ cos ϕ ⋅ A k − păcat ϕ ⋅ A l păcat ϕ ⋅ A k + cos ϕ ⋅ A l ] = [ A k 2 + A l 2 A k 2 + A l 2 − A l ⋅ A k + A k ⋅ A l A k 2 + A l 2 ] = [ A k 2 + A l 2 0 ] {\displaystyle {\begin{bmatrix}\cos {\phi }&-\sin {\phi }\\\sin {\phi }&\cos {\phi }\end{bmatrix}}{\begin{bmatrix} a_{k}\\a_{l}\end{bmatrix}}={\begin{bmatrix}\cos {\phi }\cdot a_{k}-\sin {\phi }\cdot a_{l}\\ \sin {\phi }\cdot a_{k}+\cos {\phi }\cdot a_{l}\end{bmatrix))={\begin{bmatrix}{\frac {a_{k}^{2} +a_{l}^{2}}{\sqrt {a_{k}^{2}+a_{l}^{2}}}}\\{\frac {-a_{l}\cdot a_{k }+a_{k}\cdot a_{l}}{\sqrt {a_{k}^{2}+a_{l}^{2}}}}\end{bmatrix}}={\begin{bmatrix} {\sqrt {a_{k}^{2}+a_{l}^{2}}}\\0\end{bmatrix}}}Folosind rotațiile lui Givens, se poate calcula descompunerea QR a matricelor și se poate desena matrici hermitiene într-o formă tridiagonală .
Să dorim să reducem o matrice simetrică la o formă tridiagonală:
Unde . Apoi o înmulțim cu matricea de rotație a lui Givens: . este matricea transpusă. Acest lucru va schimba doar elementele și
Aici primul denotă elementul care apare după rotație. Să alegem coeficienții și astfel încât elementul în afara diagonalei să fie setat la zero și relația dintre și cu și
Apoi:
O astfel de rotație este aplicată succesiv pentru a elimina toate elementele din primul rând, cu excepția primelor două. Adică (1,2), (1,3), (1,4)...(1,n) Apoi linia co-a doua (2,3),(2, 4)...(2) ,n)
Cod C++:
pentru ( unsigned int i = 0 ; i < N -1 ; ++ i ) { pentru ( unsigned int j = i + 2 ; j < N ; ++ j ) { t = 2 * matr [ i ][ j ] / ( matr [ i ][ i ] - matr [ j ][ j ]); phi = 0,5 * atan ( t ); c = cos ( phi ); s = sin ( phi ); bii = c * c * matr [ i ][ i ] + 2 * c * s * matr [ i ][ j ] + s * s * matr [ j ][ j ]; bij = s * c * ( matr [ j ][ j ] - matr [ i ][ i ]) + matr [ i ][ j ] * ( c * c - s * s ); bjj = s * s * matr [ i ][ i ] + c * c * matr [ j ][ j ] - 2 * c * s * matr [ i ][ j ]; bji = bij ; matr [ i ][ i ] = bii ; matr [ i ][ j ] = bij ; matr [ j ][ i ] = bji ; matr [ j ][ j ] = bjj ; } }