정리

치환행렬 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