LoginSignup
0
0

More than 1 year has passed since last update.

QR分解による対角化の可視化

Last updated at Posted at 2022-07-27

の続き。

ハウスホルダー変換によって三重対角化された後、最後にQR分解で得られた行列Qで再び相似変換することで対角化するところを可視化した。

plotA2 <- function(A, step){
  image.plot(log10(A[, ncol(A):1]+1),
    main=paste0("k = ", step),
    xaxt="n", yaxt = "n")
}

QR <- function(A, viz=FALSE, viz.dir="", num.step=100){
  if(viz){
    if(viz.dir==""){
      plotA2(A, 0)
      Sys.sleep(0.2)
    }else{
      png(file=paste0(viz.dir, "/Step0000.png"))
      plotA2(A, 0)
      dev.off()
    }
  }
  step <- 1
  while(step <= num.step){
    Q <- qr.Q(qr(A))
    A <- t(Q) %*% A %*% Q
    if(viz){
      if(viz.dir==""){
        plotA2(A, step)
        Sys.sleep(0.2)
      }else{
        png(file=paste0(viz.dir, "/Step",
          str_sub(paste0("000", step), start = -4),
          ".png"))
        plotA2(A, step)
        dev.off()
      }
    }
    step <- step + 1
  }
  list(U=U, Sigma=A)
}

# 30×30行列で実験
dir.create("QR", showWarnings=FALSE)
out2 <- QR(out$Sigma, viz=TRUE, viz.dir="QR")

merged.gif

確かに、Qが左右にかかることで、少しずつ三重対角行列が、対角行列になっていることがわかる。

試しに適当に作った対称行列で、ハウスホルダー変換を経ずにいきなりQR分解による対角化を適用してみた。

# 30×30行列で実験
dir.create("QR2", showWarnings=FALSE)
A <- matrix(runif(30*30), nrow=30, ncol=30)
A <- t(A) %*% A # 対称行列にする
out3 <- QR(A, viz=TRUE, viz.dir="QR2")

merged.gif

これでも対角化はできる模様。
互いに直交する基底を取り出すだけのQR分解がなぜ固有値分解(対角化)にもなるのかはよく知らない。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0