在Matlab中避免for循环

xueliang liu

我的功能如下:

功能

我优化的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章