使用下面的代码,我希望得到linalg.norm(y-z)
等于零。我遵循Apply DFT matrix along each axis of 3D array in NumPy?的思想,因为快速傅立叶变换和离散余弦变换都是可分离的,酉线性变换。但不知何故情况并非如此。
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')
发布于 2020-06-11 20:04:21
从以下解决方案中选择one。
axis=0
来重新定义D
:D= dct(np.eye(n)、axis=0、axis=0 D
,通过指定.T
并使用默认的axis=-1
)(实际上并不能推广到更高的维度.):
D= dct(np.eye(n),norm="ortho").T
D.T @ x
,表示axis=0
of x
:Y= D.T @x@ D
由于矩阵是对称的(D == D.T
),并且是酉的(D.conj().T @ D == 1
),所以在DFT的情况下,这个顺序并不重要。但是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
https://stackoverflow.com/questions/62335898
复制相似问题