我有一个结构数组,如:
points = struct('x',[],'y',[],'z',[])
有很多要点
points(1).x = 3
points(1).y = 4.5
points(1).z = 1
...
points(n).x = 2
points(n).y = 23
points(n).z = 4
现在给出三个坐标(x,y,z),我想现在points
中有这样一个点。因此我定义了以下功能:
function true_or_false = is_in(points, point)
for i = 1:numel(points)
if abs(points(i).x - point.x) < 1e-7 && ...
abs(points(i).y - point.y) < 1e-7 && ...
abs(points(i).z - point.z) < 1e-7
true_or_false = true;
return
end
end
true_or_false = false;
end
问题在于效率很低。有一个更好的方法吗?也许使用其他东西而不是结构?
答案 0 :(得分:3)
您可以通过利用Matlab在“方括号”或“大括号”中“捕获”逗号分隔列表的功能来对此操作进行矢量化,如[s.fieldname]
或{s.fieldname}
。当您取消引用多元素struct
的字段时,会隐式生成“以逗号分隔的列表”,在您的情况下,因为每个示例都是标量,所以在方括号内连接这些没有问题,给出您为每个坐标{1},[points.x]
和[points.y]
设置了1乘n的数值向量。然后你可以做类似的事情:
[points.z]
更一般的情况(你的字段值可能不是标量,或者可能不是数字)可能不会比你的循环方法更有效。