Вычисление I2
во внутреннем цикле может быть легко векторизовано. Это:
temp = zeros(12,12);
for i = 1:12
I2 = (d_sn2(:,i)>LL1(p,i) & d_sn2(:,i)<UL1(p,i)) & (d_sd2(:,i)>LL2(p,i) & d_sd2(:,i)<UL2(p,i));
temp(i,:) = mean(input(I2,:));
end
такой же, как этот:
I2 = d_sn2>LL1(p,:) & d_sn2<UL1(p,:) & d_sd2>LL2(p,:) & d_sd2<UL2(p,:);
temp = zeros(12,12);
for i = 1:12
temp(i,:) = mean(input(I2(:,i),:));
end
Этот код использует неявное одноэлементное расширение, если у вас есть версия MATLAB до R2016b, вам нужно будет записывать каждый вызов >
(gt
) и <
(lt
), используя bsxfun
: bsxfun(@gt,d_sn2,LL1(p,:))
и т. Д.
К сожалению, индексирование в input
намного сложнее векторизовать. Поскольку к каждой итерации i
обращаются к разному количеству элементов input
, не существует простого способа создания матрицы temp
без циклов. Несколько подходов, которые я попробовал, намного медленнее, чем код цикла.
Если вы используете довольно свежую версию MATLAB, ваш код будет достаточно эффективным. Интерпретатор MATLAB использует JIT (компилятор точно в срок), что делает циклы не такими медленными, как раньше. Например, разница в тривиальном цикле добавления всех элементов матрицы лишь в 2-3 раза медленнее, чем при использовании функции sum
. В старые времена это было, может быть, в 100 раз медленнее. Таким образом, преимущества векторизации не такие, как раньше. В сочетании с очень большим размером используемых массивов это означает, что векторизация будет пессимизацией, поскольку векторизация часто подразумевает создание еще больших промежуточных матриц.