Применение матрицы DCT по каждой оси не дает желаемого результата

Используя следующий код, я ожидаю, что linalg.norm(y-z) будет равно нулю. Я следую идее применить матрицу DFT вдоль каждого ось 3D-массива в 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')

person Pazu    schedule 12.06.2020    source источник
comment
@Ehsan Почему ты изменил это на DFT? Разве вопрос не ясно о DCT?   -  person Mateen Ulhaq    schedule 12.06.2020
comment
@MateenUlhaq Плохо. Неправильно понял. Спасибо за исправление.   -  person Ehsan    schedule 12.06.2020


Ответы (1)


Выберите одно из следующих решений.

  1. Переопределите D, указав axis=0:

    D = dct(np.eye(n), axis=0, norm="ortho")
    
  2. Переопределите D, указав .T и используя значение по умолчанию axis=-1 (на самом деле не обобщается на более высокие измерения...):

    D = dct(np.eye(n), norm="ortho").T
    
  3. Используйте D.T @ x для представления DCT вдоль axis=0 из x:

    y = D.T @ x @ D
    

Порядок не имеет значения в случае ДПФ, поскольку матрица симметрична (D == D.T) в дополнение к унитарной (D.conj().T @ D == 1). Но матрица DCT не симметрична, поэтому вы должны быть осторожны с тем, какой порядок вы используете.

Рассмотрим определение для DCT-II:

введите здесь описание изображения

Когда вы создаете оператор D, подразумевающий, что D @ x принимает DCT-II по строкам (axis=0), тогда 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
person Mateen Ulhaq    schedule 12.06.2020