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

How to test membership for structure arrays in MATLAB?

我有一个像这样的结构数组:

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

问题是这样效率很低。有一个更好的方法吗?也许使用其他东西代替结构?

您可以通过利用 Matlab 在方括号或大括号内 "catch" 逗号分隔列表的能力来矢量化此操作,如 [s.fieldname]{s.fieldname}。当您取消引用多元素 struct 的字段时,会隐式生成 "comma-separated list",并且在您的情况下,因为每个示例都是标量,所以在方括号内连接这些没有问题,给您每个坐标 [points.x][points.y][points.z] 的 1×n 数值向量。然后你可以做这样的事情:

function [true_or_false, matches] = is_in(points, point)

matches = abs([points.x] - point.x) < 1e-7 & abs([points.y] - point.y) < 1e-7 & abs([points.z] - point.z) < 1e-7;
true_or_false = any(matches);

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