吉文斯旋轉

數值線性代數中,吉文斯旋轉(英語:Givens rotation)是在兩個坐標軸所展開的平面中的旋轉。吉文斯旋轉得名於華萊士·吉文斯,他在1950年代工作於阿貢國家實驗室時把它介入到數值分析中。

矩陣表示

吉文斯旋轉表示為如下形式的矩陣

 

這裡的 c = cos(θ) 和 s = sin(θ) 出現在第 i 行和第 j 行與第 i 列和第 j 列的交叉點上。就是說,吉文斯旋轉矩陣的所有非零元定義如下::

 


乘積 G(i, j, θ)x 表示向量 x 在 (i,j)平面中的逆時針旋轉 θ 弧度。

Givens 旋轉在數值線性代數中主要的用途是在向量或矩陣中介入零。例如,這種效果可用於計算矩陣的 QR分解。超過Householder變換的一個好處是它們可以輕易的並行化,另一個好處是對於非常稀疏的矩陣計算量更小。

穩定計算

當一個吉文斯旋轉矩陣 G(i,j,θ)從左側乘另一個矩陣 A 的時候,GA 只作用於 A 的第 ij 行。所以我們集中於下列問題。給出 ab,找到 c = cos θ 和 s = sin θ 使得

 

明確計算出 θ 是沒有必要的。我們轉而直接獲取 c, sr。一個明顯的解是

 

但是為了避免上溢出和下溢出,我們使用不同的計算,採用比率 b/a (它是 tan θ)或它的倒數(Golub & Van Loan 1996)。如 Edward Anderson (2000) 在改進 LAPACK 時發現的,前瞻數值考慮是連續性的。要完成它,我們要求 r 是正數。

if (b = 0) then {c ← copysign(1,a); s ← 0; r ← abs(a)}
else if (a = 0) then {c ← 0; s ← -copysign(1,b); r ← abs(b)}
else if (abs(b) > abs(a)) then
  t ← a/b
  u ← copysign(sqrt(1+t*t),b)
  s ← -1/u
  c ← -s*t
  r ← b*u
else
  t ← b/a
  u ← copysign(sqrt(1+t*t),a)
  c ← 1/u
  s ← -c*t
  r ← a*u

這是依據 IEEE 754r copysign(x,y) 函數寫成的,它提供了安全和廉價的方式複製 y 的符號到 x。如果不能獲得它,使用符號函數x*sgn(y) 可作為替代。

注意這裡的sgn定義為

 

而不是常用的

 

後者常在高級語言中作為標準庫函數被提供,注意不要直接應用於本算法中。

參見

引用