2016-12-05 34 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); 

的更一般的情況下(在您的字段值可能不是標量,也可能不是數字),可能無法比你的循環的方法更有效。

相關問題