2012-07-19 45 views
3

我有一个for循环在matlab程序中嵌套三次。你们能帮助我优化吗?如何在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 

非常感谢!

+2

不是一个完整的答案,但快速提示开始:通过修改最outter环这样避免if语句:'对于i = 1 + W:MW '。 – Bentoy13 2012-07-19 11:44:17

+1

您可以指定您正在使用的'm','n','l'和'd'的值吗? – 2012-07-19 12:30:37

+0

@ Bentoy13这当然是第一次改进。另外,我在计算中看不到'k'的任何影响。据我可以看到所有的页面是相同的 - >使用'repmat'。 – denahiro 2012-07-19 12:49:11

回答

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 
+0

只有一件事,在此代码中,您将从1到m进行迭代,但if条件确实表明真实有效值来自i + w(代码中为6)到m-w。然后,您可以重新定义i范围并删除if条件。 – Charliemops 2012-07-19 14:38:36