在Matlab中获取数组中最近一组数字的索引?
假设我在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的索引
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
,例如,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;
下面是我创建的一个小函数,它将为您提供所要查找的任何系列的开始和结束索引:
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列:重复哪个值
- 第二列:起始位置
- 第三列:结束位置
- 第四列:重复元素的数量
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的索引。祝你好运!很高兴这有帮助。如果你找到了正确的答案,你可以把它标记为帮助社区的答案。