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 文件中完成。以下是您可以查看的一些 FEX 贡献:inpoly-mex-fileMEX 中的 Fast Inpolygon和Fast InPolygon detection MEX是一个本机 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 回答