Оптимизация вычислений типа корреляции

У меня есть код, который в настоящее время читает:

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) вместо.

Другие вопросы по тегам