是否有一个与diff相同但有两步的matlab函数?即获取X(n)-X(n-2)而不是X(n)-X(n-1)

时间:2019-02-11 10:44:15

标签: matlab double difference

我有一个向量(我们称其为v),在大多数情况下元素都等于0,但是它也可以具有序列1和序列2。我试图检测索引从哪里开始等于2。

我试图做:

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

但是它不起作用:

  

ans = 1×0空双行向量

这是因为我的向量v。它的元素永远不会直接从0变为2,在它们之间总是有一个等于1的“缓冲区”元素,因此它看起来像: 0 0 0 0 1 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 :(得分:3)

我不知道这样的功能,但是手动操作很容易:

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');

答案 1 :(得分:0)

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);