gpt4 book ai didi

python - Scipy:生成NxN离散余弦矩阵

转载 作者:行者123 更新时间:2023-12-01 01:20:32 27 4
gpt4 key购买 nike

使用 scipy,是否有一种简单的方法来模拟 MATLAB 的 dctmtx 函数的行为,该函数返回某个给定 N 的 NxN DCT 矩阵?有 scipy.fftpack.dctn 但它只应用 DCT。如果我不想使用 scipy 之外的其他依赖项,我是否必须从头开始实现它?

最佳答案

DCT 是一种线性变换,因此获取变换矩阵的一种方法是将其应用于单位矩阵。在下面的示例中,我找到了长度为 8 的序列的矩阵(对于一般情况,将 8 更改为 N):

In [124]: import numpy as np

In [125]: from scipy.fft import dct

In [126]: D = dct(np.eye(8), axis=0)

D 是矩阵:

In [127]: D
Out[127]:
array([[ 2. , 2. , 2. , 2. , 2. , 2. , 2. , 2. ],
[ 1.96157056, 1.66293922, 1.11114047, 0.39018064, -0.39018064, -1.11114047, -1.66293922, -1.96157056],
[ 1.84775907, 0.76536686, -0.76536686, -1.84775907, -1.84775907, -0.76536686, 0.76536686, 1.84775907],
[ 1.66293922, -0.39018064, -1.96157056, -1.11114047, 1.11114047, 1.96157056, 0.39018064, -1.66293922],
[ 1.41421356, -1.41421356, -1.41421356, 1.41421356, 1.41421356, -1.41421356, -1.41421356, 1.41421356],
[ 1.11114047, -1.96157056, 0.39018064, 1.66293922, -1.66293922, -0.39018064, 1.96157056, -1.11114047],
[ 0.76536686, -1.84775907, 1.84775907, -0.76536686, -0.76536686, 1.84775907, -1.84775907, 0.76536686],
[ 0.39018064, -1.11114047, 1.66293922, -1.96157056, 1.96157056, -1.66293922, 1.11114047, -0.39018064]])

验证 D @ x 等于 dct(x):

In [128]: x = np.array([1, 2, 0, -1, 3, 0, 1, -1])

In [129]: dct(x)
Out[129]: array([10. , 4.02535777, -1.39941754, 7.38025967, -1.41421356, -6.39104653, -7.07401092, 7.51550307])

In [130]: D @ x
Out[130]: array([10. , 4.02535777, -1.39941754, 7.38025967, -1.41421356, -6.39104653, -7.07401092, 7.51550307])

请注意,D @ x 通常会比 dct(x) 慢得多。

<小时/>

与Matlab的dctmtx完全一致,添加参数 norm='ortho'。例如,这是 Octave 中的 dctmtx(它返回与 Matlab 中相同的数组):

octave:1> pkg load image
octave:2> dctmtx(4)
ans =

0.50000 0.50000 0.50000 0.50000
0.65328 0.27060 -0.27060 -0.65328
0.50000 -0.50000 -0.50000 0.50000
0.27060 -0.65328 0.65328 -0.27060

这是使用scipy.fft.dct的计算:

In [56]: from scipy.fft import dct

In [57]: dct(np.eye(4), axis=0, norm='ortho')
Out[57]:
array([[ 0.5 , 0.5 , 0.5 , 0.5 ],
[ 0.65328148, 0.27059805, -0.27059805, -0.65328148],
[ 0.5 , -0.5 , -0.5 , 0.5 ],
[ 0.27059805, -0.65328148, 0.65328148, -0.27059805]])

关于python - Scipy:生成NxN离散余弦矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53875821/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com