numpy 沿沿着每个轴应用DCT矩阵,未得到预期结果

pb3skfrl  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(83)

使用下面的代码,我希望得到linalg.norm(y-z)等于零。我遵循Apply DFT matrix along each axis of 3D array in NumPy?的思想,因为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')
klh5stk1

klh5stk11#

  • 选择以下解决方案之

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

D = dct(np.eye(n), axis=0, norm="ortho")

1.通过指定.T并使用默认的axis=-1来重新定义D(并没有真正推广到更高的维度):

D = dct(np.eye(n), norm="ortho").T

1.使用D.T @ x表示沿xaxis=0的DCT沿着:

y = D.T @ x @ D

在DFT的情况下,顺序无关紧要,因为矩阵是对称的(D == D.T)*,除了 * 是酉的(D.conj().T @ D == I)。但是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

相关问题