首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在每个轴上应用DCT矩阵不给出期望的结果

在每个轴上应用DCT矩阵不给出期望的结果
EN

Stack Overflow用户
提问于 2020-06-12 01:00:45
回答 1查看 257关注 0票数 0

使用下面的代码,我希望得到linalg.norm(y-z)等于零。我遵循Apply DFT matrix along each axis of 3D array in NumPy?的思想,因为快速傅立叶变换和离散余弦变换都是可分离的,酉线性变换。但不知何故情况并非如此。

代码语言:javascript
运行
复制
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')
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-12 04:04:21

从以下解决方案中选择one

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

D= dct(np.eye(n)、axis=0、axis=0 D,通过指定.T并使用默认的axis=-1 )(实际上并不能推广到更高的维度.):

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

  • Use 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,以便正确处理转换的协方差和反方差。

完整的例子:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62335898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档