Векторизация логических выражений - PullRequest
2 голосов
/ 12 августа 2011

У меня есть массив 1 x n. Я хотел бы проверить, больше ли каждый элемент, чем его пять последовательных элементов. То есть i>i+1 & i>i+2 & i>i+3 & i>i+4 & i>i+5.

Как бы я сделал это без каких-либо петель?

Ответы [ 2 ]

4 голосов
/ 12 августа 2011
idx = 1:numel(x)-5;
I = x(idx) > x(idx+1) & x(idx) > x(idx+2) & x(idx) > x(idx+3) & x(idx) > x(idx+4) & x(idx) > x(idx+5)

Обратите внимание, что на самом деле это не обрабатывает последние 5 элементов x, потому что это зависит от того, что вы хотите, чтобы вывод был.

3 голосов
/ 12 августа 2011

Рассмотрим это векторизованное решение:

N = 5;                                        %# number of consequent values
idx = hankel(2:N+1, N+1:numel(x));            %# indices of sliding windows
y = all( bsxfun(@gt, x(1:end-N), x(idx)) )    %# comparison

Результатом является логический вектор, где y(i) указывает, больше ли x(i), чем все x(i+1), x(i+2), ..., x(i+N)

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