2016-12-05 33 views
0

我有一个结构阵列,如:在它如何在MATLAB中测试结构数组的成员资格?

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 = struct('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

您是否要求[代码评论](http://codereview.stackexchange.com/)? –

+0

我在寻求解决问题的有效方法。 – IIIaxS

回答

3

您可以通过利用Matlab的能力内的方形或大括号“钓”逗号分隔的列表,如[s.fieldname]{s.fieldname}矢量化此操作。当您取消引用多元素字段struct时会隐式生成“逗号分隔列表”,并且在您的情况下,由于每个范例都是标量,因此连接这些内部方括号没有任何问题,因此可以为您提供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); 

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

相关问题