1

假设我在 Matlab 中有一个数组:

x = [1 1 1 2 2 2 3 3 3 3 2 2 3 3 3 1 1 1 1 1 2 2 2 2 3 3 3]

我想要最近一组连续'1's 的索引。在这种情况下,我想要答案:

answer = [16 17 18 19 20] % (which should correspond to the last sequence of 1's)

我需要一种在 Matlab 中自动执行此操作的方法,它适用于任何大小的数组,总是给我最后一组连续 1 的索引。

有什么建议么?

4

3 回答 3

2

这是一种方法:

I=find(diff([0, x==1, 0]),2,'last');
answer = I(1):I(2)-1;

x==1返回一个逻辑向量,在1任何地方x都等于10否则。

>> x==1
ans =
 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0

当你对其应用diff函数时,你会得到另一个向量,其中连续1的 s 被删除,最后一个非零的两个元素与1s的原始序列相关

>> diff(x==1)
 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 -1 0 0 0 0 0 0

但是,当第一个和最后一个元素包含 时,使用它会失败1,例如, forx=[0 0 1 1 1]x=[1 1 1 0 0]。所以我们添加0到开头和结尾并find返回它们的索引

>> I = find(diff(x==1), 2, 'last')
I =
    16    21

它的第二个参数表示我们希望它返回多少个元素,第三个参数表示它们应该是第一个还是最后一个元素。现在您可以通过以下方式创建答案

answer = I(1):I(2)-1;
于 2013-07-01T17:24:46.430 回答
1

我前段时间写了FEX:findseq来查找开始/结束位置和连续值条纹的长度:

x = [1 1 1 2 2 2 3 3 3 3 2 2 3 3 3 1 1 1 1 1 2 2 2 2 3 3 3];

seq = findseq(x)
seq =
     1     1     3     3
     2     4     6     3
     3     7    10     4
     2    11    12     2
     3    13    15     3
     1    16    20     5
     2    21    24     4
     3    25    27     3

在哪里:

  • 第 1 列:重复哪个值
  • 第二栏:起始位置
  • 第三栏:结束位置
  • 第四栏:重复元素的数量

从那里您可以检索最后一连串 1 的位置:

pos = find(seq(:,1) == 1,1,'last');
seq(pos,2):seq(pos,3)
ans =
    16    17    18    19    20
于 2013-07-01T19:57:15.763 回答
0

这是我创建的一个小函数,它将为您提供您正在寻找的任何系列的开始和结束索引:

function [first, last] = findLastSeries(aArray, num2Find)

    found = aArray == num2Find;
    ii = find(found == 1, 1, 'last');
    last = ii;
    while found(ii) ~= 0 && ii > 1
        ii = ii - 1;
    end

    if ii == 1 && found(ii) == 1
        first = ii;
    else
        first = ii + 1;
    end
end

运行以下脚本将为您提供:

test = [1 1 1 2 2 2 3 3 3 3 2 2 3 3 3 1 1 1 1 1 1 2 2 2 2 3 3 3];

[lFirst, lLast] = findLastSeries(test, 1);

lFirst
lLast

lFirst =

    16


lLast =

    21

如果您想要完整的索引数组,只需执行以下操作:

range = lFirst:lLast

range =

    16    17    18    19    20    21
于 2013-07-01T17:32:42.817 回答