Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Matlab中获取数组中最近一组数字的索引?_Matlab - Fatal编程技术网

在Matlab中获取数组中最近一组数字的索引?

在Matlab中获取数组中最近一组数字的索引?,matlab,Matlab,假设我在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的索引

假设我在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的索引


有什么建议吗?

这里有一种方法:

I=find(diff([0, x==1, 0]),2,'last');
answer = I(1):I(2)-1;
x==1
返回一个逻辑向量,该向量在任何地方都等于
1
x
等于
1
,否则为
0

>> 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被删除,最后两个非零元素与
1
s的原始序列相关

>> 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
,例如,for
x=[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;

下面是我创建的一个小函数,它将为您提供所要查找的任何系列的开始和结束索引:

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
我在前一段时间写过一篇文章,想找出连续数值条纹的起始/结束位置和长度:

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

你试过什么?在任何人都想尽力帮助你之前,你需要表现出你的努力。我什么都不能尝试,因为我不知道从哪里开始;)。我可以设置一个循环,从数组的大小开始倒计时,找到最后一个1的位置,然后继续,直到它再次发生变化。这里有一个起点:find(diff(x))将获得新区域开始的索引。diff将输出一个比x短的向量,所以一定要为此进行调整。看看你能从那里做些什么,但是你自己的评论可能是更好的起点。你在评论中写的matlab语法是“find(x==1,1,'last')”,这是最后1的索引。祝你好运!很高兴这有帮助。如果你找到了正确的答案,你可以把它标记为帮助社区的答案。