3

我在 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

非常感谢!。

4

1 回答 1

2

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

例如,您可以执行if (i-w >= 1 && i+w <= m)更高的两个级别(因为它仅取决于iwm),减少 if 检查并跳过循环迭代。完成后,您的featureL计算featureR可以上移一级;它们在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
于 2012-07-19T12:55:57.553 回答