沿每个轴应用 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')

选择 一个 以下解决方案。

  1. 通过指定 axis=0 重新定义 D:

    D = dct(np.eye(n), axis=0, norm="ortho")
    
  2. 通过指定 .T 并使用默认值 axis=-1 重新定义 D(并没有真正推广到更高维度...):

    D = dct(np.eye(n), norm="ortho").T
    
  3. 使用D.T @ x表示沿xaxis=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