2017-02-01 2 views
4

Мне в настоящее время нужно немного ускорить мой код и, следовательно, хочу использовать векторию вместо циклов. Следующий код (очень) упрощенная версия кода, который вызывается много во время моего расчета:Векторизация и векторная индексация

T=10; n=5; w0 = 25000; w1 = 23000; b0 = 15000; 
    vec = zeros(1,T+2*n+1); vec(1:n+1) = w0; vec(n+2:n+T+1) = b0; vec(n+T+2:T+2*n+2) = w1; 
    ref0=zeros(1,n); 
    for i = 1:n 
     ref0(i) = sum(vec(T+i+2:n+T+i+2)); 
    end 

Я попытался использовать векторизации, но, к сожалению, не похоже на работу, как только первая запись из моего вектор я используется в качестве входных данных в процессе индексирования вектора:

i = 1:n; 
ref1 = sum(vec(T+i+2:n+T+i+2)); 

выход следующий:

ref0 = 

    106000  114000  122000  130000  138000 

ref1 = 

    106000 

есть ли способ для достижения этой ref1 дает тот же результат, ref0 с помощью векторизации? Это может быть супер очевидным, но я, кажется, не добираюсь дальше. Я благодарен за любую помощь! Заранее большое спасибо.

+2

Это связано с тем, что оператор двоеточия ':' не принимает векторы в качестве входов и вместо этого использует только первый элемент векторного ввода. – Suever

+3

Векотризация не обязательно означает ускорение. Вы прокомментировали свой код? –

+0

'vec' инициализируется столбцами' T + 2 * n + 1', а затем столбцу '2 * n + T + 2' присваивается значение ... не проблема векторизации, просто может потребоваться исправление? – Wolfie

ответ

5

Вы можете использовать movsum вместо вашего цикла:

ref1 = movsum(vec(T+3:T+2*n+2),n+1,'Endpoints','discard'); 
+0

Спасибо большое! Это похоже на трюк;) – banan

2

Свертка также работает:

c = conv(ones(1,n+1), vec(T+3:2*n+T+2), 'same'); 
ref2 = c(1:end-1); 
4

Это должно быть очень эффективным, если n и T имеют малые значения и vec длинный вектор:

ref1 = cumsum(vec); 
ref1 = ref1(T+n+3:end) - ref1(T+2:end-n-1); 
+0

upvote, потому что это другая функция, а затем movsum, но особенно для больших векторов «vec», это должно быть медленнее, чем использование movsum, потому что вторая строка также не является тривиальной операцией. Кто-то с Matlab мог бы дать некоторые тайм-ауты для удовольствия. –

Смежные вопросы