如何使此for循环更有效?

时间:2019-10-16 22:49:06

标签: matlab performance for-loop

我已经为一个函数编写了代码,该函数可以从三角表面找到所有连接的顶点。 曲面由顶点列表(VL) m x 3 和面列表(FL) n x 3 制成。 VL的每一行都是一个点(x y z)。
FL的每一行索引VL的三行。这三个点构成一个三角形。

function List = findVLInd(FL, StartingPoint)

  List = StartingPoint;

  for a = 1:50000
    List = [List;find(List(a,1)==FL(:,1))];
    List = [List;find(List(a,1)==FL(:,2))];
    List = [List;find(List(a,1)==FL(:,3))];

    Lz = FL(List,:);
    List = [List;Lz(:,1);Lz(:,2);Lz(:,3)];
    List = unique(List);
  end 
end

脚本运行后,有50,000个数字可用作VL的索引。

不幸的是,这确实很慢。可能是因为for循环以及每个循环不断增长的列表。任意设置数字50,000。我的FL大约有116,000行,但并非所有行都相互连接。

如何提高效率?

1 个答案:

答案 0 :(得分:0)

在语法方面,我建议以下内容:

function List = findVLInd(FL, StartingPoint)

  List = StartingPoint;

  for a = 1:50000
    List(end+1, :) = [find(List(a,1)==FL(:,1))];
                      find(List(a,1)==FL(:,2))];
                      find(List(a,1)==FL(:,3))];

    Lz = FL(List,:);
    List(end+1:end+size(Lz,1), :) = [Lz(:,1);Lz(:,2);Lz(:,3)];
    List = unique(List);
  end 
end

这将删除重新分配操作List = [List; X],该操作将列表的内容复制到另一个变量中,然后将其删除(尽管新变量的名称与前一个相同),并用附加操作替换它,这很在Matlab中更快,但仍然很慢。通过在单个块中调用for循环中的前三行,我还可以减少此类操作的次数。

根据ChrisLuengopacta-sunt-servanda的评论,您可能还需要解决其他问题,以改善代码的功能。