我的功能如下:
我优化的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循环吗?谢谢
我不确定这是否会更快,但是repmat
可以使用代替您的窍门bsxfun
。这个技巧与numpy中标准的数组广播非常相似,并且省去了诸如的大型中间矩阵的创建mHUE
。
您应该始终做的另一件事是将不依赖的所有内容移出循环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循环只会使您的功能很难理解,因此只需保留原样即可。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句