Векторизация столбцов мудрой логической индексации матрицы - PullRequest
0 голосов
/ 01 ноября 2018

Я делаю логическое индексирование матрицы в MATLAB по столбцам. Примером может быть:

tic

N = 5*10^6;
input = randi(100,N,12);
output = zeros(N,1);

d_sn2 = randi(25,N,12);
d_sd2 = randi(25,N,12);

LL1 = randi(8,N,12);
UL1 = randi([12,20],N,12);

LL2 = randi(8,N,12);
UL2 = randi([12,20],N,12);

for p = 1:N
    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
    output(p) = max(temp(:));
end

toc               

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

1 Ответ

0 голосов
/ 04 ноября 2018

Вычисление 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 раз медленнее. Таким образом, преимущества векторизации не такие, как раньше. В сочетании с очень большим размером используемых массивов это означает, что векторизация будет пессимизацией, поскольку векторизация часто подразумевает создание еще больших промежуточных матриц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...