在matlab中矢量化嵌套for循环和逐点乘法

时间:2014-02-17 18:28:09

标签: matlab

长期读者,第一次审问。所以我目前正在从以下代码中遇到严重的瓶颈:

for kk=1:KT
    parfor jj=1:KT
        umodes(kk,jj,:,:,:) = repmat(squeeze(psi(kk,jj,:,:)), [1,1,no_bands]).*squeeze(umodes(kk,jj,:,:,:));
    end
end

用简单的语言,我需要将多维数组'psi'平铺在另一个长度为'no_bands'的维度上,然后用矩阵'umodes'进行逐点乘法。问题是我正在使用的每个阵列都很大,大约20 GB或更多。

我怀疑,正在发生的事情是我的处理器因缓存限制或数据被分页而停止运行。我有理由相信没有减少数组大小的实用方法,所以在这一点上我试图将计算开销减少到最低限度。

如果不可能,可能是时候考虑使用正确的编程语言,我可以通过引用强制执行传递,以避免不必要的数组复制。

1 个答案:

答案 0 :(得分:0)

通常bsxfun使用的内存少于repmat。所以你可以尝试:

for kk=1:KT
    parfor jj=1:KT
        umodes(kk,jj,:,:,:) = bsxfun(@times, squeeze(psi(kk,jj,:,:)), squeeze(umodes(kk,jj,:,:,:)));
    end
end

或者你可以对两个循环进行矢量化。矢量化通常更快,虽然不一定更具内存效率,所以我不确定它对你的情况有帮助。无论如何,bsxfun benefits from multihreading

umodes = bsxfun(@times, psi, umodes);