2016-12-05 18 views
0

Iのような構造体のアレイを有する:その中の多くの点を有するMATLABで構造体配列のメンバシップをテストする方法は?

points = struct('x',[],'y',[],'z',[]) 

今3点の座標(X、Y、Z)は、Aがある場合、私は今したい所与

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 

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

この操作は、[s.fieldname]または{s.fieldname}のように、角か括弧で囲まれたカンマで区切られたリストを「キャッチ」するMatlabの機能を利用してベクトル化することができます。 structのマルチエレメントのフィールドを逆参照すると、カンマで区切られたリストが暗黙的に生成されます。それぞれの例がスカラーなので、これらの角括弧の中に連結しても問題ありません。各座標の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); 

より、一般的なケース:次に、あなたのような何かをするかもしれません。

関連する問題