2

いくつかの気象データを取得してから雲をポリゴンに変換するモデルを最適化して、それらをさらに活用できるようにしています。
コードは機能していますが、その種類は遅いです。プロファイラーを実行すると、次の行が呼び出され106360430、処理に約 50 秒かかることがわかりました。
これらの行をより効率的にする方法はありますか?

function [oddNodes] = pointInPolygon (point,thePolygon)
% determine if a point is in the polygon (faster than matlab "inpolygon"command

polyPoints=size(thePolygon,1);    % number of polygon points
oddNodes = false;

j=polyPoints;
x=point(1); y=point(2);

for i=1:polyPoints
if (thePolygon(i,2)<y && thePolygon(j,2)>=y ||  thePolygon(j,2)<y && thePolygon(i,2)>=y)
if (thePolygon(i,1)+(y-thePolygon(i,2))/(thePolygon(j,2)-thePolygon(i,2))*(thePolygon(j,1)-thePolygon(i,1))<x)
oddNodes=~oddNodes;
end
end
j=i; 
end
4

3 に答える 3

2

inPolygontest は重い関数であり、おそらく mex ファイルで実行するのが最適です。inpoly-mex-fileFast Inpolygon in MEX、およびFast InPolygon detection MEXの FEXコントリビューションをいくつか紹介します。これは、 matlabよりも高速なネイティブの matlab コードですinpoly

于 2012-10-15T12:32:31.010 に答える
1

次のようにコードをベクトル化します (ループを使用する代わりに行列で作業します)。

function [oddNodes] = pointInPolygon (point,thePolygon)

polyPoints=size(thePolygon,1);    % number of polygon points
oddNodes = false;

j=polyPoints;
x=point(1); y=point(2);

% this part has been vectorized:

thePolygon2=circshift(thePolygon,1);
t1=(thePolygon(:,2)<y & thePolygon2(:,2)>=y | thePolygon2(:,2)<y & thePolygon(:,2)>=y);
t2=(thePolygon(:,1)+(y-thePolygon(:,2))/(thePolygon2(:,2)-thePolygon(:,2))*(thePolygon2(:,1)-thePolygon(:,1))<x);

oddNodes=mod(sum(t1&t2),2);
于 2012-10-15T14:46:50.220 に答える
0

速度についてはテストしませんでしたが、一般的な方法は次のようになります。同じ行を 106360430 回実行するのではなく、コードをベクトル化してみてください。したがって、次のように形にしてみてください。

output = pointMatrixInPolygon (pointMatrix,thePolygon)

次に、関数内のループを回避しようとすると、そこにいるはずです。実際には、マトリックスを通常の inpolygon 関数にフィードするだけでよい場合があります。

于 2012-10-15T14:19:21.243 に答える