我有一个包含“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循环的建议 - 避免这样做吗?
谢谢
答案 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来调整索引。