我的功能如下:
我的优化matlab代码是:
function gamma = calcGamma(H, d, delta, f)
s= size(H);
Nv = s(1);
Ne = s(2);
gamma = zeros(Ne,1);
for e =1:Ne
hue = H(:,e);
sdu=f./sqrt(d);
mHUE = repmat(hue',Nv,1);
mHVE = repmat(hue,1,Nv);
mSDU = repmat(sdu',Nv,1);
mSd = repmat(sdu,1,Nv);
ss1 = mHUE .* mHVE/delta(e) .* (mSDU-mSd).^2;
gamma(e) = sum(ss1(:));
end
然而,由于Ne非常大,计算函数需要相当长的时间。
我看到一个类似的问题有一个很好的解决方案,但我不明白它是如何得出的。
避免for循环的任何解决方案?感谢
答案 0 :(得分:1)
我不确定这是否会更快,但您可以使用bsxfun
代替repmat
的技巧。这个技巧非常类似于numpy中标准的array broadcasting,并保存了像mHUE
这样的大型中间矩阵的创建。
您应该始终做的另一件事是move everything out of the loop不依赖于e
。在我看来,sdu
的计算是完全不变的,所以在循环之前做一次。我猜delta(e)
是一个标量,所以不要将大矩阵除以,而是在之后做一次:
s= size(H);
Nv = s(1);
Ne = s(2);
gamma = zeros(Ne,1);
sdu = f./sqrt(d);
M = bsxfun(@minus, sdu', sdu).^2;
for e =1:Ne
hue = H(:,e);
ss1 = bsxfun(@times, hue', hue) .* M;
gamma(e) = sum(ss1(:));
end
gamma = gamma ./ delta;
有可能删除for循环,但是这会增加速度是值得怀疑的,因为你只有一个循环而且你的计算时间无论如何都由大矩阵的乘法支配。此外,删除for循环只会让你的函数很难理解,所以请保持原样。