是否有一个与 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');
我有一个向量(我们称它为 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');