Кажется, что замена преобразования Фурье на косинусное преобразование была неправильным временем для оптимизации, поскольку скрывает тот факт, что этот расчет корреляции действительно является просто продуктом двух преобразований Фурье (что является единственным эффективным способом вычисления корреляций. знать).
С ir1=Angle[i] r1
и ir2=Angle[j] r2
ваше выражение эквивалентно
Sum[Cos[f[x1, x2] ir1 + f[y1, y2] ir2], {x1, HL}, {x2, HL}, {y1, HL+1, 2 HL}, {y2, HL+1, 2 HL}]
== Re@Sum[Exp[I f[x1, x2] ir1] Exp[I f[y1, y2] ir2], {x1, HL}, {x2, HL},{y1, HL+1, 2 HL}, {y2, HL+1, 2 HL}]
== Re[corr1[ir1] corr2[ir2]]
где
corr1[ir_]:=Sum[Exp[I f[x1, x2] ir], {x1, HL}, {x2, HL}];
corr2[ir_]:=Sum[Exp[I f[y1, y2] ir], {y1, HL+1, 2 HL}, {y2, HL+1, 2 HL}];
Поскольку я уже сократил ваш показатель масштабирования пополам, я ожидаю, что вы счастливы :), но если f
является действительным значением, вы можете сократить еще один фактор из двух показателей:
В этом случае мы можем выразить corr1
как интеграл по значениям f
- учитывая, что вы можете каким-то образом получить весовую функцию w
. Если ничего другого, вы можете сделать это численно с помощью простой процедуры биннинга.
corr1v2[ir_]:=Sum[ w[fval] Exp[I fval ir], {fval,fvals}],
, который проясняет, что corr1
на самом деле является просто преобразованием Фурье весовой функции f
(так что вы должны вычислять его с БПФ, а не с суммой, указанной выше). То же самое касается corr2
.
В качестве альтернативы, если f
не является действительным значением, но имеет достаточную симметрию, чтобы позволить вам выполнить повторную параметризацию в форме, поэтому f
зависит только от одного из новых параметров (скажем, r
, phi
), вы также сократить corr1
интегралы в одном измерении, хотя это может быть не просто преобразование Фурье.