沿每个轴应用 DCT 矩阵未给出所需的结果
Applying DCT matrix along each axis not giving the desired result
使用下面的代码,我希望 linalg.norm(y-z)
等于零。我遵循 的想法,因为 FFT 和 DCT 都是可分离的酉线性变换。但不知何故,情况并非如此。
import numpy as np
from scipy.fftpack import dct
x = np.random.rand(5,5)
D = dct(np.eye(5), norm='ortho')
y = np.dot(D,np.dot(x, D.T))
z = dct(dct(x, axis = 0 , norm = 'ortho'), axis = 1 , norm = 'ortho')
选择 一个 以下解决方案。
通过指定 axis=0
重新定义 D
:
D = dct(np.eye(n), axis=0, norm="ortho")
通过指定 .T
并使用默认值 axis=-1
重新定义 D
(并没有真正推广到更高维度...):
D = dct(np.eye(n), norm="ortho").T
使用D.T @ x
表示沿x
的axis=0
的DCT:
y = D.T @ x @ D
对于 DFT,顺序无关紧要,因为矩阵是对称的 (D == D.T
) 另外 是单一的 (D.conj().T @ D == 1
) .但是DCT矩阵不是对称的,所以你要注意你使用的顺序。
考虑 DCT-II 的定义:
当您构造运算符 D
以暗示 D @ x
沿着行 (axis=0
) 采用 DCT-II 时,则必须定义 D
以便变换的协方差和逆变都得到妥善处理。
完整示例:
import numpy as np
from scipy.fftpack import dct
n = 5
x = np.random.rand(n, n)
D = dct(np.eye(n), axis=0, norm="ortho")
y = D @ x @ D.T
z = x
z = dct(z, axis=0, norm="ortho")
z = dct(z, axis=1, norm="ortho")
>>> np.linalg.norm(z - y)
6.20161216470283e-16
使用下面的代码,我希望 linalg.norm(y-z)
等于零。我遵循
import numpy as np
from scipy.fftpack import dct
x = np.random.rand(5,5)
D = dct(np.eye(5), norm='ortho')
y = np.dot(D,np.dot(x, D.T))
z = dct(dct(x, axis = 0 , norm = 'ortho'), axis = 1 , norm = 'ortho')
选择 一个 以下解决方案。
通过指定
axis=0
重新定义D
:D = dct(np.eye(n), axis=0, norm="ortho")
通过指定
.T
并使用默认值axis=-1
重新定义D
(并没有真正推广到更高维度...):D = dct(np.eye(n), norm="ortho").T
使用
D.T @ x
表示沿x
的axis=0
的DCT:y = D.T @ x @ D
对于 DFT,顺序无关紧要,因为矩阵是对称的 (D == D.T
) 另外 是单一的 (D.conj().T @ D == 1
) .但是DCT矩阵不是对称的,所以你要注意你使用的顺序。
考虑 DCT-II 的定义:
当您构造运算符 D
以暗示 D @ x
沿着行 (axis=0
) 采用 DCT-II 时,则必须定义 D
以便变换的协方差和逆变都得到妥善处理。
完整示例:
import numpy as np
from scipy.fftpack import dct
n = 5
x = np.random.rand(n, n)
D = dct(np.eye(n), axis=0, norm="ortho")
y = D @ x @ D.T
z = x
z = dct(z, axis=0, norm="ortho")
z = dct(z, axis=1, norm="ortho")
>>> np.linalg.norm(z - y)
6.20161216470283e-16