【问题标题】:Optimization a recurring matlab code优化重复出现的matlab代码
【发布时间】:2012-10-05 10:13:34
【问题描述】:

我正在优化一个模型,该模型获取一些天气数据,然后将云转换为多边形,以便进一步利用它们。
该代码正在运行,但它的速度很慢。通过运行分析器,我发现以下行被调用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

【问题讨论】:

    标签: performance matlab optimization if-statement


    【解决方案1】:

    inPolygon 测试是一个繁重的功能,最好在 mex 文件中完成。以下是您可以查看的一些 FEX 贡献:inpoly-mex-fileFast Inpolygon in MEXFast InPolygon detection MEXHere是原生matlab代码,比matlabinpoly快。

    【讨论】:

    • 我正在调查 FEX 的贡献。谢谢
    【解决方案2】:

    我没有测试它的速度,但一般的方法是: 与其运行同一行 106360430 次,不如尝试对代码进行矢量化。 因此,试着把它塑造成这样:

    output = pointMatrixInPolygon (pointMatrix,thePolygon)
    

    然后尽量避免函数内部的循环,你应该在那里。实际上,您可能只是将矩阵提供给常规的 inpolygon 函数。

    【讨论】:

      【解决方案3】:

      像这样矢量化您的代码(处理矩阵而不是使用循环):

      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);
      

      【讨论】:

      • 嘿!你能解释一下最后一行吗?你怎么能取一个值为“真”6“假”的数组的总和……然后取一个模型?
      • @user1734167 t1&t2 是 AND 操作,所以结果是一个二进制数组。 Matlab 允许您对其求和,将真数计为 1,将假数计为 0。因此 sum(t1&t2) 计算两个数组中为真的位置数。然后,您只需取该数字的模数,这与在每次迭代中“翻转”oddNodes 变量(即您的代码中的内容)相同。
      • 嘿,代码有效,但需要更多时间..我猜与矢量化版本相比,短路逻辑运算符在原始版本中节省了大量时间。我认为没有其他更快的方法。
      猜你喜欢
      • 2011-11-30
      • 1970-01-01
      • 2011-11-03
      • 2013-11-12
      • 2016-10-21
      • 2018-03-14
      • 2015-02-21
      • 2014-03-16
      • 2013-10-04
      相关资源
      最近更新 更多