如何在matlab中优化嵌套for循环

时间:2012-07-19 10:50:05

标签: matlab optimization vectorization

我在matlab程序中有一个for循环嵌套三次。你们中的任何人都可以帮助我优化它吗?

w=5;
a = rand(m*n,10); b=rand(m,n);
for i = 1 : m
   for j = 1 : n
      for k = 1 : l
         if (i-w >= 1 && i+w <= m)
             featureL = a(((i-1)*n)+j,:); featureR = a(((i-1)*n)+j-d,:);
             D1(i,j,k) = sqrt( sum( (featureL - featureR) .* (featureL - featureR) ) );
             D2(i,j,k) = mean2( b(i-w:i+w, j-w:j+w) );
         end
      end
   end
end

我知道使用meshgrid可以大大提高性能,但我不知道该怎么做。

感谢您的期待。

可以这样做......

[X Y Z] = meshgrid(1:m,1:n,1:l);
D1(something containing X,Y,Z) = sqrt( sum( ( a(something cont. X,Y) - a(something cont. X,Y)).*(a(something cont. X,Y) - a(something cont. X,Y)) ) );
% similarly D2

非常感谢!

1 个答案:

答案 0 :(得分:2)

我发现攻击这些东西的好方法是渐进式的。首先检查最内层循环中的所有内容,看看它是否可以在更高级别完成。这将减少重复计算。

例如,您可以将if (i-w >= 1 && i+w <= m)两个级别提高(因为它仅取决于iwm),从而减少检查和跳过循环迭代。 完成后,您的featureLfeatureR计算可以向上移动一级;它们在k循环内执行,但仅依赖于j。同样,sqrt( sum( (featureL - featureR) .* (featureL - featureR) ) )可以在k循环之外计算,放入变量,稍后分配。

事实上,据我所知,你可以摆脱整个k循环,因为从未使用k。以下是您的代码,其中包含一些应用:

w=5; 
a = rand(m*n,10); 
b=rand(m,n); 
for i = 1 : m
    if (i-w >= 1 && i+w <= m)
        for j = 1 : n
            featureL = a(((i-1)*n)+j,:); 
            featureR = a(((i-1)*n)+j-d,:);
            x = sqrt( sum( (featureL - featureR) .* (featureL - featureR) ) );
            y = mean2( b(i-w:i+w, j-w:j+w) )           
            D1(i,j,:) = x;              
            D2(i,j,:) = y;
        end    
    end 
end
相关问题