如何在MATLAB中测试结构数组的成员资格?

时间:2016-12-05 19:09:01

标签: matlab membership

我有一个结构数组,如:

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

问题在于效率很低。有一个更好的方法吗?也许使用其他东西而不是结构?

1 个答案:

答案 0 :(得分:3)

您可以通过利用Matlab在“方括号”或“大括号”中“捕获”逗号分隔列表的功能来对此操作进行矢量化,如[s.fieldname]{s.fieldname}。当您取消引用多元素struct的字段时,会隐式生成“以逗号分隔的列表”,在您的情况下,因为每个示例都是标量,所以在方括号内连接这些没有问题,给出您为每个坐标{1},[points.x][points.y]设置了1乘n的数值向量。然后你可以做类似的事情:

[points.z]

更一般的情况(你的字段值可能不是标量,或者可能不是数字)可能不会比你的循环方法更有效。