치환행렬 Q 에서 고유벡터를 구하고, 이렇게 구한 고유벡터로 행렬을 구성하면 이산 푸리에 변환 행렬 Discrete Fourier Transform 이 됨을 코드로 검토한다.
# 치환 행렬 생성
Q <- matrix(c(0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0), nrow = 4, byrow = T)
Q
## [,1] [,2] [,3] [,4]
## [1,] 0 1 0 0
## [2,] 0 0 1 0
## [3,] 0 0 0 1
## [4,] 1 0 0 0
# QTQ = I 검토
t(Q) %*% Q
## [,1] [,2] [,3] [,4]
## [1,] 1 0 0 0
## [2,] 0 1 0 0
## [3,] 0 0 1 0
## [4,] 0 0 0 1
# Q의 고유벡터 추출
A <- eigen(Q)
A$values
## [1] -1+0i 1+0i 0+1i 0-1i
A$vectors
## [,1] [,2] [,3] [,4]
## [1,] -0.5+0i -0.5+0i 0.5+0.0i 0.5+0.0i
## [2,] 0.5+0i -0.5+0i 0.0+0.5i 0.0-0.5i
## [3,] -0.5+0i -0.5+0i -0.5-0.0i -0.5+0.0i
## [4,] 0.5+0i -0.5+0i 0.0-0.5i 0.0+0.5i
# F4 형태로 고유벡터를 재배치한다.
col1 <- -1 * A$vectors[,2]
col2 <- A$vectors[,3]
col3 <- -1 * A$vectors[,1]
col4 <- A$vectors[,4]
F4 <- matrix(c(col1, col2, col3, col4), nrow = 4, byrow = F)
F4
## [,1] [,2] [,3] [,4]
## [1,] 0.5+0i 0.5+0.0i 0.5+0i 0.5+0.0i
## [2,] 0.5+0i 0.0+0.5i -0.5+0i 0.0-0.5i
## [3,] 0.5+0i -0.5-0.0i 0.5+0i -0.5+0.0i
## [4,] 0.5+0i 0.0-0.5i -0.5+0i 0.0+0.5i
# F4 역시 직교행렬임을 검토한다. F4'F4 = I
round(Conj(F4) %*% F4)
## [,1] [,2] [,3] [,4]
## [1,] 1+0i 0+0i 0+0i 0+0i
## [2,] 0+0i 1+0i 0+0i 0+0i
## [3,] 0+0i 0+0i 1+0i 0+0i
## [4,] 0+0i 0+0i 0+0i 1+0i
# F4의 컬럼2와 컬럼4의 내적이 직교함을 검토한다. 컬럼2.컬럼4 = 0
round(Conj(col2) %*% col4)
## [,1]
## [1,] 0+0i