我在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
非常感谢!
答案 0 :(得分:2)
我发现攻击这些东西的好方法是渐进式的。首先检查最内层循环中的所有内容,看看它是否可以在更高级别完成。这将减少重复计算。
例如,您可以将if (i-w >= 1 && i+w <= m)
两个级别提高(因为它仅取决于i
,w
和m
),从而减少检查和跳过循环迭代。
完成后,您的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