如何在Matlab中优化嵌套的for循环

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

非常感谢!

2
不是完整的答案,只是一个快速提示:通过修改最外层循环来避免if语句,例如这样:for i=1+w:m-w - Bentoy13
1
你能指定你正在使用的 mnld 的值吗? - Eitan T
@Bentoy13,这确实是一个首次改进。我没有看到k对计算有任何影响。就我所看到的,所有页面都是相同的->使用“repmat”。 - denahiro
1
始终有利于优化- mlint your_file_name 的输出。它会提供许多警告,告诉你应该预分配D1和D2。 - bdecaf
@raghudeep:我怀疑你打错了字:d的值是多少?它和w一样吗?另外,公式如何取决于k?请仔细检查你的代码。 - Amro
1个回答

2
我发现逐步攻击这些问题是一个不错的方式。从最内部的循环开始检查并看看是否可以在更高级别上完成。这将减少重复计算。
例如,您可以在两个级别更高的地方执行if (i-w >= 1 && i+w <= m)(因为它只依赖于iwm),从而减少if检查和跳过循环迭代。 一旦完成了这项工作,您的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

只剩下最后一件事,在这个代码中,你正在从1迭代到m,但是if条件确保真正有效的值在i+w(代码中为6)和m-w之间。那么您可以重新定义i的范围并删除if条件。 - Charliemops

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接