Удалить целые строки в структурном массиве 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));