如何在向量中找到“截止”索引?

时间:2014-08-23 07:54:44

标签: matlab

我有一个包含“chuncks”数据的向量,由几乎为零的“chuncks”分隔(< epsilon) 例如:

[ 18, 19, 34, 27, 0.1, 0.02, 0.04, 0.15 , 19, 23, 20, 34 ]

我想找到almosא - zeros序列开始和结束的索引, 即:指数0.1(5)和指数0.15(8)

一个重要的说法是,在“截止”之前可能会有一些几乎为零,但不是“长”序列

例如,如果我有矢量:

[30 , 14, 15 , 89, 0.3, 17 , 40, 0.4, 0.05, 0.1, 0.2, 80, 16, 40, 1, 22]

我想找回索引:8,11

任何关于goos循环的建议 - 避免这样做吗?

谢谢

1 个答案:

答案 0 :(得分:0)

在Matlab中,这种简单的问题可以在没有任何循环的情况下进行矢量化:

x = [30 , 14, 15 , 89, 0.3, 17 , 40, 0.4, 0.05, 0.1, 0.2, 80, 16, 40, 1, 22];
epsilon = 0.5;
close_to_zero = x < epsilon;  % logical vector

% get logical vectors indicating 0-1 and 1-0 transitions
start = ~close_to_zero(1:end-1) & close_to_zero(2:end);
stop = close_to_zero(1:end-1) & ~close_to_zero(2:end);

% get indices of transitions
istart = find(start) + 1;
istop = find(stop);

% get length of sequences and kick out short ones
sequence_length = istop - istart + 1;
long_sequence = sequence_length > 2;  % logical vector
istart = istart(long_sequence)
istop = istop(long_sequence)

结果:

istart = 8
istop = 11

请注意,这仅适用于向量x未以序列接近零开始或结束的情况。要解决此问题,您应该在开头和结尾(close_to_zero)填充close_to_zero = [false, x < epsilon, false];,并相应地通过减去1来调整索引。