-1

可能重复:
优化重复出现的 matlab 代码

向量化是优化这段代码的好选择吗?什么标准决定我们是否对代码进行矢量化?还有什么可以做的?

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

1 回答 1

2

请做一些研究,谷歌上有用的点击量简直是压倒性的:

  1. http://www.softsurfer.com/Archive/algorithm_0103/algorithm_0103.htm
  2. http://www.mathworks.com/matlabcentral/fileexchange/10391-fast-points-in-polygon-test
  3. 地理围栏 - 点内/外多边形
  4. http://www.mathworks.com/matlabcentral/fileexchange/12744-distance-from-a-point-to-polygon

等等

话虽如此:您的代码建议您只想确定一个是否位于多边形内。在那种情况下,为什么要麻烦,因为inpolygon可以在 5 秒内确定百万顶点多边形。

现在,如果您想为大量点执行此操作,但多边形中的顶点不多(或相反),您最好将点数传递给函数:

function in = pointInPolygon(points, poly)

    nn = size(poly,1);
    in = false(nn,1);

    for ii = 1:size(points,2)

        x = points(ii,1);
        y = points(ii,2);

        yn = false;
        for jj = 1:size(poly,1)

            if (poly(jj,2)<y && poly(nn,2)>=y || ...
                poly(nn,2)<y && poly(jj,2)>=y)

                if (poly(jj,1)+(y-poly(jj,2))/(poly(nn,2)-poly(jj,2))*...
                   (poly(nn,1)-poly(jj,1))<x)
                    yn = ~yn;
                end

            end
            nn = jj;
        end

        in(ii) = yn;

    end

end

因为这使 Matlab 能够在两个循环中使用 JIT。一个简单的测试:

poly = rand(6e6,2);
poly = [poly ; poly(1,:)];

xy   = rand(1e3,2);

tic         
    in = pointInPolygon(xy, poly);
toc

结果:

Elapsed time is 0.324801 seconds.

现在,如果你想对大量的点进行测试,在多边形中有大量的顶点,你最好将所有这些都翻译成 C 语言并编写一个 mex 文件。毕竟这是一个相当繁重的算法,当你对它也提出了很高的要求时,你将不得不切换你的工具集。

于 2012-10-18T15:42:23.150 回答