Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
matlab中的嵌套循环矢量化与逐点乘法_Matlab - Fatal编程技术网

matlab中的嵌套循环矢量化与逐点乘法

matlab中的嵌套循环矢量化与逐点乘法,matlab,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”执行逐点乘法。问

长期读者,第一次调查者。因此,我目前遇到了以下代码的严重瓶颈:

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或更大

我猜想,接下来发生的事情是,由于缓存限制或数据正在被分页,我的处理器会停止运行。我有理由相信,没有切实可行的方法来减少数组的大小,因此在这一点上,我试图将计算开销降至最低

如果这是不可能的,那么可能是时候考虑使用适当的编程语言了,在这种语言中,我可以强制执行按引用传递,以避免不必要的阵列复制。

通常比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:


您使用的是本地工人还是分布式工人?对于本地工作人员,我假设此代码使用普通For运行得更快,因为您使用的大多数函数可能都是使用多个核心实现的。如果你没有足够的内存,矢量化是没有帮助的。嗨,丹尼尔,答案是本地的。那么,你是说,我试图通过将所有的东西都分配到多个核来变得聪明,这实际上妨碍了matlab完成它的工作?你能做一个运行求和,并且只对被乘以的矩阵的分量进行索引吗?如果矩阵中没有唯一的数据,为什么要使用存储冗余信息的内存,对吗?这看起来像是卷积的表亲。您是否考虑过尝试使用fft来实现这一部分?谢谢你,路易斯。有一个函数是这样工作的,这真是令人毛骨悚然,但哦,好吧,这就是Matlab。你是说bsxfun吗?是的,几个月前我发现它时,它给我留下了深刻的印象
umodes = bsxfun(@times, psi, umodes);