Удалить целые строки в структурном массиве Matlab в зависимости от ввода поля

У меня есть массив структур 1x1008 EEG.event с полями

latency
duration
channel
bvtime
bvmknum
type
code
urevent

Я хочу удалить все строки, где запись в поле EEG.event.type = 'border' или 'R 1'

Я попробовал следующий цикл:

for b = 1:length(EEG.event)  

     if strcmp(EEG.event(b).type, 'boundary')
        EEG.event(b) = [];
     elseif strcmp(EEG.event(b).type, 'R  1')
        EEG.event(b) = [];
     end

end

Это не работает, конечно, так как счетная переменная b в какой-то момент превышает длину EEG.event,

У кого-нибудь есть идеи как удалить отдельные строки?

3 ответа

Измените ваш цикл, чтобы выполнить итерацию в обратном направлении по массиву, сначала удаляя элементы в конце:

for b = length(EEG.event):-1:1
   ...

Спасибо всем за ваши ответы!

Эта прямая строка кода делает работу:

[ EEG.event( strcmp( 'boundary', { EEG.event.type } ) | strcmp( 'R  1', { EEG.event.type } ) ) ] = [];

Ура!

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

Самый простой способ сделать это - преобразовать event.type поля всех структур в массив ячеек, и использовать strcmp на всех них одновременно, чтобы построить логическую матрицу, которую вы можете использовать для индексации в EEG.event чтобы получить записи, которые вам небезразличны.

Вы можете положить все type значения в массиве ячеек, как это

types = {EEG.event.type};

Затем создайте свой логический массив, ища типы событий "границы"

isBoundary = strcmp(types, 'boundary');

И получить подмножество EEG.event записи, как это.

boundaryEvents = EEG.event(isBoundary);

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

isBoundary = strcmp(types, 'boundary');
isR1 = strcmp(types, 'R  1');

% Keep the entries that aren't boundary or R1 types
events_to_use = EEG.event(~(isBoundary | isR1));
Другие вопросы по тегам