从数组matlab中选择所有'77'区间

时间:2013-11-21 13:41:05

标签: arrays matlab

我有一个充满数据的数组 - 但数据与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开始。我怎么能这样做?

3 个答案:

答案 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]