根据字段条目删除struct array matlab中的整行

Delete entire rows in struct array matlab depending on field entry

我有 1x1008 结构数组 EEG.event 和字段

latency
duration
channel
bvtime
bvmknum
type
code
urevent

我想删除在字段 EEG.event.type = 'boundary' 或 '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 的长度。

有谁知道如何删除特定行?

您遇到的根本问题是,您修改的结构数组与您尝试循环的结构数组相同。这通常是个坏主意,会导致您遇到的问题。

最简单的方法是将所有结构的 event.type 字段实际转换为元胞数组,并同时对所有结构使用 strcmp 来构造一个逻辑矩阵,您可以用于索引 EEG.event 以获取您关心的条目。

您可以像这样将所有 type 值放入元胞数组中

types = {EEG.event.type};

然后通过查找 'boundary'

的事件类型来创建逻辑数组
isBoundary = strcmp(types, 'boundary');

并像这样获取 EEG.event 个条目的子集。

boundaryEvents = EEG.event(isBoundary);

如果您想要一部分类型不是 'boundary' 或 '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));

将循环更改为向后遍历数组,首先删除末尾的元素:

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

感谢大家的回答!

这行简单的代码完成了工作:

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

干杯!