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

Is there a matlab function that does the same as diff but with a 2-step? i.e. get X(n)-X(n-2) instead of X(n)-X(n-1)

我有一个向量(我们称它为 v),其中的元素大部分时间都等于 0,但它也可以有 1 的序列和 2 的序列。我正在尝试检测它所在的索引开始等于2.

我试过:

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

但是不行:

ans = 1×0 empty double row vector

这是因为我的向量v。它的元素不会直接从0到2,中间总是有一个等于1的"buffer"元素,所以它看起来像: 0 0 0 0 1 1 1 1 0 0 0 0 1 2 2 2 0 0 0 ...

我正在寻找一个可以做与 diff 相同但 returns X(n)-X(n-2) 而不是 X(n)-X(n-1) 的函数来解决我的问题,或任何其他解决方案

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

我知道没有这样的功能,但是手动很容易做到:

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