在 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
索引。
我的印象是 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
索引。