Оптимизация вычислений типа корреляции
У меня есть код, который в настоящее время читает:
data = repmat(1:10, 1, 2);
N = 6;
period = 10;
result = NaN * zeros(1, period);
for i=1:period
range_indices = i:i+N;
temp_data = data(range_indices);
result(i) = sum( temp_data .* fliplr(temp_data));
end
Я пытаюсь сделать это быстрее (для больших наборов данных, например, period = 2000 и N = 1600), но я не могу получить это в форме, где это матричная операция (например, с помощью conv или xcorr).
1 ответ
Решение
Вы должны быть в состоянии полностью линеаризовать это. Во-первых, рассмотрим range_indices
, Они имеют форму:
1 -> N
2 -> N+1
...
P -> N+P
где P - период. Мы можем настроить матрицу этих значений следующим образом:
range_indices = bsxfun(@plus,1:N,(1:period)'-1);
Мы можем использовать их для непосредственного получения данных, например, так:
temp_data = data(range_indices);
Тогда довольно просто завершить функцию:
result = sum(temp_data.*fliplr(temp_data));
Наконец, это на самом деле не связано с вопросом, но я хотел бы отметить, что в будущем, если вам потребуется сгенерировать матрицу значений NaN, вам следует использовать nan(1,period)
вместо.