の続き。
ハウスホルダー変換によって三重対角化された後、最後に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")
確かに、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")
これでも対角化はできる模様。
互いに直交する基底を取り出すだけのQR分解がなぜ固有値分解(対角化)にもなるのかはよく知らない。