我有一个长度为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