在 matlab 中索引结构

Indexing a Structure in matlab

我的印象是 matlab 中的结构类似于 sql 中的查询表,但我觉得我可能错了。

我有一个相当大的数据集,其中包含许多条目和许多字段。理想情况下,我想索引结构,只提取我感兴趣的数据。这是数据集的示例

Cond       Type   Stime    ETime
    2       10      1       900
    2       10      1       900
    2       10      1       900
    3       1       901     1800
    3       1       901     1800
    4       1       1801    2700
    8       1       901     1800
    8       1       901     1800
    9       1       901     1800
    9       1       901     1800
    12      1       901     1800
    12      1       901     1800
    13      10      1       900
    13      10      1       900
    13      10      1       900
    16      1       901     1800
    16      1       901     1800
    17      10      1       900
    17      10      1       900
    17      10      1       900
    19      10      1       900
    19      10      1       900
    19      10      1       900
    20      10      1       900
    20      10      1       900
    20      10      1       900
    22      1       901     1800
    22      1       901     1800
    25      10      1       900
    25      10      1       900
    25      10      1       900
    27      1       901     1800
    27      1       901     1800
    28      1       901     1800
    28      1       901     1800
    30      1       1801    2700
    31      1       901     1800
    31      1       901     1800
    32      10      1       900
    32      10      1       900
    32      10      1       900
    35      10      1       900
    35      10      1       900
    35      10      1       900

我想做的是为分析示例提取特定数据条目,我想要 Type 等于 10 的所有条目,或者我想要 1:20 中的所有 Cond ETime == 900.

我可以通过以下方式做到这一点

idx = find([stats.Type] == 10);
[stats(idx).Stime]

但是对于多种类型,我需要一个 for 循环,因为尝试使用向量会引发错误。

idx = find([stats.Type] == 1:10); % Does not work


% must use this
temp = [];
for aa = 1:10
    idx = find([stats.Type] == aa);
    temp = horzcat(idx,temp);
end
[stats(temp).Stime]

这是使用结构的错误方法吗?有没有更简单的方法来索引结构以提取感兴趣的数据?

这个答案建议使用 table 索引而不是结构索引,这有点偏离了直接回答问题。但是,我对此 post 的评论被认为是有用的,所以我已经将其正式化为答案...


如果您使用 struct2table,那么您可以将其作为 table 与其交互,这通常更加直观。

如果您的字段具有不同数量的元素(即您无法形成一致的高度 table),则结构很有用。在几乎所有其他领域,我发现 tables 更易于使用。

使用 tables 你可以使用:

  • 逻辑索引

  • 排序(包括sortrows按列名)

  • "join" 操作家族

  • 用于按名称访问 table 列的点表示法,就像访问结构字段一样,或使用 myTable( :, {'col1','col2'} ) 按名称访问 select 多个列。 - 你不需要像 [stats.Type] 这样奇怪的语法技巧来对输出进行分组,你可以只做 stats.Type

然后我会使用 ismember 将多个项目与 table 列进行比较...

idx = ismember( stats.Type, 1:10 );

除非你需要索引,否则为了速度可以跳过find,直接使用idx索引。