我有一个充满数据的数组 - 但数据与77个间隔(长度不同)交叉 像这样
[-1, 2, 2, 4, -5, 77, 77, 77, 6, 5, 34, 77, 77, 4, 7...]
找到这个间隔的任何开始或结束索引没有问题,但我需要以某种方式保存它们的索引(?)数组(我认为)对此不好(但也许有一个解决方法如何做到这一点写在矩阵中?但结果有不同的维度.. 所以输入
[-1, 2, 2, 4, -5, 77, 77, 77, 6, 5, 34, 77, 77, 4, 7...]
期待一个答案
[6,7,8]
[12,13]
索引从1开始。我怎么能这样做?
答案 0 :(得分:2)
您可以使用diff
来检测每次运行的开始和结束,并使用arrayfun
来创建连续索引的单元格数组:
data = [-1, 2, 2, 4, -5, 77, 77, 77, 6, 5, 34, 77, 77, 4, 7]; %// example data
aux = diff(data==77); %// add dummy value at end, in case final data is 77
starts = find(aux==1)+1;
if data(1)==77 %// special case: start with a run
starts = [1 starts];
end
ends = find(aux==-1);
if data(end)==77 %// special case: end with a run
ends = [ends numel(data)];
end
result = arrayfun(@(n) starts(n):ends(n), 1:length(starts), 'uni', false);
使用示例数据,这给出了:
>> result{1}
ans =
6 7 8
>> result{2}
ans =
12 13
答案 1 :(得分:1)
如果是
[6,8]
[12,13]
你想要的,
并且回答是
m=[-1, 2, 2, 4, -5, 77, 77, 77, 6, 5, 34, 77, 77, 4, 7]
r=[find([1,m]~=77&[m,1]==77);find([m,1]~=77&[1,m]==77)-1]'
准确地获得你的要求:
for bounds=[find([1,m]~=77&[m,1]==77);find([m,1]~=77&[1,m]==77)-1];
disp(bounds(1):bounds(2))
end
如果要测试负数而不是77,则将〜= 77替换为> = 0,将== 77替换为< 0。
答案 2 :(得分:1)
这是做你想做的事的一种方式。最终索引收集在单元格F
中。我已在评论中包含所有打印输出,以便您可以逐步完成,但我会简要解释一下我正在做什么,因为这是一个非常难看的解决方案。
使用向量A
作为数据,我首先使用77
查找与find()
匹配的所有索引。然后我想在两个连续索引之间的差异大于1的位置处剪切该向量。我想使用mat2cell()
将矢量转换为单元格,因此我再次使用diff()
来获取所有长度。
A = [-1, 2, 2, 4, -5, 77, 77, 77, 6, 5, 34, 77, 77, 4, 7];
B = find(A==77); %// B = [6 7 8 12 13]
C = diff(B); %// C = [1 1 4 1]
D = find(C~=1); %// D = [3]
E = diff([0 D length(B)]); %// E = [3 2]
F = mat2cell(B,1,E); %// F = [1x3 double] [1x2 double]
%// F{1} = [6 7 8]
%// F{2} = [12 13]