【发布时间】: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]