如何在 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);
更一般的情况(您的字段值可能不是标量,或者可能不是数字)可能无法比循环方法更有效。
我有一个像这样的结构数组:
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);
更一般的情况(您的字段值可能不是标量,或者可能不是数字)可能无法比循环方法更有效。