提取数组中大于零的值集的索引



我有一个长度为n的数组。该数组具有制动能量值,索引号表示以秒为单位的时间。

阵列结构如下:

  • Index 1 to 140, array has zero values.(车辆未制动(

  • Index 141 to 200, array has random energy values.(车辆制动再生能量(

  • Index 201 to 325, array has zero values.(车辆未制动(

  • Index 326 to 405, array has random energy values.(车辆制动再生能量(

。。。对于长度为CCD_ 6的阵列以此类推。

我想做的是得到每组能量值的起始和结束索引号

例如,上面的序列给出了这样的结果:

141 - 200
326 - 405
...   

有人能建议我用什么方法或技巧来得到这个结果吗?

使用diff是一种快速的方法。

这里有一个演示(详细信息请参阅评论(:

% Junk data for demo. Indices shown above for reference
%    1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17
x = [0, 0, 0, 2, 3, 4, 0, 0, 1, 1, 7, 9, 3, 4, 0, 0, 0];
% Logical converts all non-zero values to 1
% diff is x(2:end)-x(1:end-1), so picks up on changes to/from zeros
% Instead of 'logical', you could have a condition here, 
% e.g. bChange = diff( x > 0.5 );
bChange = diff( logical( x ) );
% bChange is one of the following for each consecutive pair:
%   1 for [0 1] pairs
%   0 for [0 0] or [1 1] pairs
%  -1 for [1 0] pairs
% We inflate startIdx by 1 to index the non-zero value
startIdx = find( bChange > 0 ) + 1; % Indices of [0 1] pairs
endIdx = find( bChange < 0 );   % Indices of [1 0] pairs

我将把它作为一个练习来捕捉边的情况,在这种情况下,如果数组以非零值开始或结束,则添加开始或结束索引。提示:您可以单独处理每种情况,也可以在初始x中添加额外的结束值。

以上输出:

startIdx 
>> [4, 9]
endIdx
>> [6, 14]

因此,您可以按照自己的意愿对其进行格式化,以获得跨度4-6, 9-14

此任务由两种方法执行,两种方法都能完美执行。

Wolfie方法:

bChange = diff( EnergyB > 0 );
startIdx = find( bChange > 0 ) + 1;  % Indices of [0 1] pairs
endIdx = find( bChange < 0 );        % Indices of [1 0] pairs

结果:

startIdx=

141
370
608
843

endIdx=

212
426
642
912

第二种方法:

startends = find(diff([0; EnergyB > 0; 0]));
startends = reshape(startends, 2, [])';
startends(:, 2) = startends(:, 2) - 1

结果:

startends=

141         212
370         426
608         642
843         912

相关内容

  • 没有找到相关文章

最新更新