Извлечение индексов наборов значений больше нуля в массив - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть массив длины 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. (Автомобиль тормозил и регенерировал энергию)

... и т. Д. Для массива длины n.

Что я хочу сделать, это получить начальный и конечный порядковый номер каждого набора значений энергии.

Например, приведенная выше последовательность дает такой результат:

141 - 200
326 - 405
...   

CanКто-нибудь, пожалуйста, предложите, какой метод или технику можно использовать, чтобы получить этот результат?

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Эта задача выполняется двумя способами. Оба работают отлично.

Метод Вольфа:

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
0 голосов
/ 04 декабря 2018

Использование 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...