Векторизация для цикла - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь векторизовать это для цикла. Есть идеи?

D = 1x8851;

for k = 1:length(D)-1

    P(k) = ((D(k)<=0)&&(D(k+1)>=0))||((D(k)>=0)&&(D(k+1))<0);

 end

1 Ответ

3 голосов
/ 21 мая 2019

Для двух вещей, имеющих разные знаки, это означает, что их произведение отрицательно:

P(k) = ((D(k)<=0)&&(D(k+1)>=0))||((D(k)>=0)&&(D(k+1))<0);

совпадает с:

P(k) = ( D(k) * D(k+1) ) <= 0;

Это просто векторизовать, просто преобразовав операции в поэлементные операции:

P = ( D(1:end-1) .* D(2:end) ) <= 0;

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

P = ((D(1:end-1)<=0)&(D(2:end)>=0))|((D(1:end-1)>=0)&(D(2:end))<0);

Однако более короткое выражение требует меньше промежуточных матриц и меньше операций, и поэтому будет быстрее.

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