Есть ли функция Matlab, которая делает то же самое, что и diff, но с 2 шагами?т.е. получить X (n) -X (n-2) вместо X (n) -X (n-1) - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть вектор (назовем его v), в котором элементы в большинстве случаев равны 0, но он также может иметь последовательности 1 и последовательности 2. Я пытаюсь определить индексы, с которых он начинаетбыть равным 2.

Я пытался сделать:

ind = find(diff(v) == 2);

Но это не работает:

ans = 1 × 0 пустой вектор из двух строк

Это из-за моего вектора v. Его элементы никогда не переходят от 0 к 2 напрямую, всегда есть элемент «буфера», равный 1 между ними, поэтому он выглядит так: 0 0 0 01 1 1 1 0 0 0 0 1 2 2 2 0 0 0 ...

Я ищу функцию, которая может делать то же самое, что и diff, но возвращает X (n) -X (n-2)вместо X (n) -X (n-1), чтобы решить мою проблему, или любое другое решение

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Нет такой функции, о которой я знаю, но это легко сделать вручную:

v = [6 9 4 8 5 2 5 7]; % example data
step = 2; % desired step
result = v(1+step:end)-v(1:end-step); % get differences with that step

В качестве альтернативы (спасибо @ CrisLuengo за подсказку), вы могли быиспользуйте свертку следующим образом:

result = conv(v, [1 zeros(1,step-1) -1], 'valid');
0 голосов
/ 11 февраля 2019

ind = find(diff(v) == 2); выделит индексы, где значение v увеличилось на 2.

Вам необходимо определить значения, равные 2, а затем использовать diff для поиска первого значения.ind = find(diff(v == 2)); ближе к вашим потребностям.

Следующий код должен работать нормально:

%Make a logical vector, true if v equal 2
valueIs2 = (v==2);

%Make a logical vector where:
% First value is true if the vector v starts with 2
% The next values are true only if this is the first 2 of a sequence
isStartOfSequence = [v(1) diff(v)>0];

%another equivalent option:
isStartOfSequence = [v(1) (v(2:end) & ~v(1:end-1))];

% Use find to convert logical to indices
indicesStartOfSequence = find(isStartOfSequence);
...