我有一个包含数千个数据样本的结构。每个数据点包含多个对象。例如:
Structure(1).a = 7
Structure(1).b = 3
Structure(2).a = 2
Structure(2).b = 6
Structure(3).a = 1
Structure(3).b = 6
...
... (thousands more)
...
Structure(2345).a = 4
Structure(2345).b = 9
...等等。
如果我想找到所有包含数字 6 的“.b”对象的索引号,我会期望以下函数可以解决问题:
find(Structure.b == 6)
...我希望答案包含“2”和“3”(对于上面显示的输入)。
但是,这是行不通的。什么是正确的语法和/或我能否首先以更合乎逻辑的方式安排我的数据?
最佳答案
结构数组的语法 Structure.b
给你一个 comma-separated list ,因此您必须将它们全部连接起来(例如,使用方括号 []
)以获得向量:
find([Structure.b] == 6)
对于上面显示的输入,结果符合预期:
ans =
2 3
正如 Jonas 指出的那样,这只有在没有包含空矩阵的字段时才有效,因为空矩阵不会反射(reflect)在串联结果中。
处理具有空字段的结构
如果您怀疑这些字段可能包含空矩阵,请将它们转换为 NaN
(如果可能...)或考虑使用 Rody 建议的一种更安全的解决方案。
此外,我想到了另一个有趣的解决方法,即使用字符串。我们可以将所有内容连接成一个带分隔符的字符串以保留有关空字段的信息,然后将其标记化(以我的拙见,这在 MATLAB 中比处理存储在单元格中的数值更容易完成)。
受 Jonas 评论的启发,我们可以将空字段转换为 NaN
,如下所示:
str = sprintf('%f,', Structure.b)
B = textscan(str, '%f', 'delimiter', ',', 'EmptyValue', NaN)
这允许您对 B
的内容应用 find
:
find(B{:} == 6)
ans =
2
3
关于matlab - 将查找与结构一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14480876/