2

我有一个功能如下:

功能

我优化的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循环的解决方案?谢谢

4

1 回答 1

1

我不确定这是否会更快,但是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 循环只会使您的函数非常难以理解,因此请保持原样。

于 2013-10-12T15:12:27.933 回答