我有一个向量(我们称其为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)的函数来解决我的问题,或其他任何问题解决方案
答案 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);