Сципи: сгенерировать NxN дискретную косинусную матрицу - PullRequest
0 голосов
/ 20 декабря 2018

Используя scipy, существует ли простой способ эмулировать поведение функции dctmtx MATLAB, которая возвращает матрицу DCT NxN для некоторого заданного N?Есть scipy.fftpack.dctn, но это касается только DCT.Должен ли я реализовать это с нуля, если я не хочу использовать другую зависимость, кроме scipy?

1 Ответ

0 голосов
/ 21 декабря 2018

DCT - это линейное преобразование, поэтому один из способов получить матрицу для преобразования - применить ее к единичной матрице.Вот пример, где я нахожу матрицу для последовательностей длины 8 (для общего случая изменим 8 на N):

In [124]: import numpy as np

In [125]: from scipy.fftpack 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).

...