在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中ETime==900的所有Cond

我可以通过以下来完成

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,则可以将其作为一个表进行交互,这通常更直观。

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

有了可以使用的表格:

  • 逻辑索引

  • 排序(包括按列名的sortrows(

  • "加入"操作家族

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新