我觉得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
进行索引。