В настоящее время я использую фильтр Гадзоу в Python.
Чтобы поместить в некоторый контекст. Вы начинаете с одномерного массива (давайте возьмем диапазон (10) в качестве примера) и строим из него ганкелеподобную матрицу, такую как
H= [[0, 1, 2, 3, 4, 5],
[1, 2, 3, 4, 5, 6],
[2, 3, 4, 5, 6, 7],
[3, 4, 5, 6, 7, 8],
[4, 5, 6, 7, 8, 9]])
После этого вы выполняете некоторую линейную алгебру с этой матрицей, которая не является проблемой Затем следует самый трудоемкий этап, который представляет собой проблему усреднения.
В новой матрице B вы усредняете элементы полученной матрицы. В первом ряду вы усредняете все элементы по пути, заданному точными значениями в H. Так что-то вроде выключенных диагоналей, но идущих сверху справа внизу слева. Во втором срезе вы игнорируете первую строку и т. Д.
Матрица $ H $ будет инвариантной на этом этапе анализа, но, например, Матрица
1 2 2 1
1 1 1 1
1 1 1 1
станет
1 1.5 1.33 1
1 1 1 1
1 1 1 1
Хорошо, я надеюсь, вы понимаете проблему. Мой (рабочий, но неэффективный) код
def av_diag(A,i,j):
dim = A.shape
# get the "borders" of A
lim = min((dim[0]-i,j+1))
# calculate the mean
return np.mean([A[i+it,j-it] for it in range(lim)])
def avHankel(A):
# get the mean for all elements by nested list comprehension
return np.array([[av_diag(A,i,j) for j in range(len(A[0]))] for i in range(len(A))])
Это займет некоторое время для моих данных, содержащих 2048 точек данных, что приведет к матрице 1024x1023.
И я был бы рад за возможные трюки, чтобы ускорить это.
Спасибо