如何在MATLAB中测试结构阵列的隶属度?

如何在MATLAB中测试结构阵列的隶属度?,matlab,membership,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),我想知道在点中是否有这样一个点。因此,我定义了以下函数: function true_or_false = is_in(points, point

我有一个结构数组,如:

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),我想知道在
点中是否有这样一个点。因此,我定义了以下函数:

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
函数true\u或false=is\u in(点,点)
对于i=1:numel(点)
如果abs(点(i).x-点.x)<1e-7&&。。。
abs(点(i).y-点.y)<1e-7&&。。。
abs(点(i).z-点.z)<1e-7
真或假=真;
返回
结束
结束
真或假=假;
结束

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

您可以利用Matlab的能力,在方括号或花括号内“捕获”逗号分隔的列表,将此操作矢量化,如
[s.fieldname]
{s.fieldname}
中。当您取消引用多元素结构的字段时,会隐式生成一个“逗号分隔列表”,在您的例子中,由于每个示例都是标量,因此将它们连接在方括号内是没有问题的,以便为每个坐标、
[points.x]
[points.y]
提供一个1×n的数字向量[points.z]
。然后您可以执行以下操作:

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);
函数[真或假,匹配]=is\u in(点,点)
匹配=abs([points.x]-point.x)<1e-7和abs([points.y]-point.y)<1e-7和abs([points.z]-point.z)<1e-7;
真或假=任何(匹配);

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

您可以利用Matlab在方括号或花括号内“捕获”逗号分隔列表的能力,将此操作矢量化,如
[s.fieldname]
{s.fieldname}
。当您取消引用多元素
结构的字段时,会隐式生成一个“逗号分隔列表”,在您的示例中,由于每个示例都是标量,因此将它们连接在方括号内不会有问题,从而为每个坐标提供一个1×n的数值向量,
[points.x]
[points.y]
[points.z]
。然后您可以执行以下操作:

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);
函数[真或假,匹配]=is\u in(点,点)
匹配=abs([points.x]-point.x)<1e-7和abs([points.y]-point.y)<1e-7和abs([points.z]-point.z)<1e-7;
真或假=任何(匹配);

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

你是在要求一个有效的替代方案来解决问题吗?我是在要求一个有效的替代方案来解决问题。你是在要求一个吗?我是在要求有效的替代方案来解决问题。