【问题标题】:Indexing a Structure in matlab在matlab中索引结构
【发布时间】:2018-12-05 23:06:49
【问题描述】:

我的印象是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]

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

【问题讨论】:

  • 如果您使用struct2table,那么您可以将其作为表格进行交互,这通常更加直观。
  • 我应该将我的数据输出为表格而不是结构吗?我正在使用结构,因为我认为它们是可查询的。
  • 如果您的字段具有不同数量的元素(即您无法形成一致的高度表),则结构很有用。在几乎所有其他领域,我发现表格更易于使用。对于表,您可以使用逻辑索引、排序、“连接”操作等。您还可以使用点表示法按名称访问表列,就像访问结构字段一样,或者使用myTable( :, {'col1','col2'} ) 按名称选择多个列。您不需要像 [stats.Type] 这样奇怪的句法技巧来对输出进行分组,您只需使用 stats.Type
  • ismember 也是过滤多个值的可靠工具。
  • 确实,find(ismember([stats.Type],1:10)); 正是您要找的。此外,您可能依赖于逻辑选择而不是索引,因此在这种简单情况下不需要find[stats(ismember([stats.Type],1:10)).Stime]

标签: matlab structure


【解决方案1】:

这个答案建议使用表索引而不是结构索引,这是直接回答问题的一个侧面步骤。但是,我在这篇文章中的 cmets 被认为是有用的,所以我已经正式作为答案......


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

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

您可以使用表格:

  • 逻辑索引

  • 排序(包括sortrows按列名)

  • “加入”操作系列

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

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

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

除非您需要索引,否则您可以跳过使用find 以提高速度,直接使用idx 进行索引。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 2011-12-14
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多