重新排列操作以优化和矢量化嵌套循环算法

时间:2018-03-09 18:05:48

标签: matlab loops optimization vectorization

我有一系列嵌套循环,用于将数据存储在单元格数组中。我试图找到加快循环的方法,也有助于简化可读性。我已经对循环进行了一些优化,但我想看看是否可以进一步对其进行矢量化。我原来的代码看起来像这样:

%% ORIGINAL LOOP
for iA = 1:length(arrA)
  for iB = 1:length(arrB)
    for iC = 1:length(arrC)

      a = arrA(iA);               % depends only on iA
      a_x = AData.x(AData.a==a);
      a_y = AData.y(AData.a==a);

      b = arrB(iB);               % depends only on iB
      b_x = BData.x(BData.b==b);
      b_y = BData.y(BData.b==b);

      c = arrC(iC);               % depends only on iC

      FinalData{iA,iB,iC} = computedata(a_x, a_y, b_x, b_y, c);

    end
  end
end 

由于a, a_x, a_y的计算仅依赖于iA,我将它们从内部循环中拉出来,并且对其他变量做了类似的操作,这显着提高了性能:

%% FASTER LOOP
for iA = 1:length(arrA)
  a = arrA(iA);
  a_x = AData.x(AData.a==a);
  a_y = AData.y(AData.a==a);

  for iB = 1:length(arrB)
    b = arrB(iB);
    b_x = BData.x(BData.b==b);
    b_y = BData.y(BData.b==b);

    for iC = 1:length(arrC)
      c = arrC(iC);

      FinalData{iA,iB,iC} = computedata(a_x, a_y, b_x, b_y, c);

    end
  end
end

我想知道是否有更好的方法来加速这个过程,也许是通过MATLAB矢量化(完全消除循环)。

我还想让它更紧凑,更容易重新排列循环的顺序,如果需要,我计划设计用于绘制各种顺序的东西的其他功能。任何提示将不胜感激。

0 个答案:

没有答案