更快地计算平均值和差异

17次观看(过去30天)
鑫
2017年12月28日
回答: 大卫·桑托斯2019年8月20日
大家好。我在一个FD代码上工作,需要在非常大的3D/2D矩阵中做很多平均。我想做以下任务,以1D为例。
一个向量是:A=[A,b,c,d,e,f],我想得到每两个相邻值之间的平均值,所以我做A=(A(2:end)+A(1:end-1))/2。我也经常做diff,比如diff(a,1)在2D和3D的情况下也是一样的。但当我处理非常大的矩阵时,就会变得非常慢,比如1000*1000*1000。有更快的方法吗?
非常感谢。

接受的答案

约翰D 'Errico
约翰D 'Errico 2017年12月28日
编辑:约翰D 'Errico 2017年12月28日
得到更多的内存。大问题需要更多的记忆,或者一杯咖啡。坐下来,放松,拿出那本旧的《战争与和平》,读下去。
如果您的矩阵是1000x1000x1000,那么它有1e9个元素,每个元素将需要8字节的RAM来存储。这个矩阵使用了大约8g的RAM来存储。
现在,当您在数组上计算某些操作时,例如diff或连续元素之间的局部平均值,这将创建一个几乎相同大小的NEW数组。因此,一个新的数组也需要8g的RAM。
该数组的每一个拷贝都迫使MATLAB多分配8 gb的RAM。你的电脑有多少gb的内存?例如,我的现在有点老了,所以它总共只有8个演出。
当MATLAB用完内存时会做什么?它开始交换数据,使用虚拟内存。这变得很慢,非常快,即使它可以找到这样做的磁盘空间。
所以如果你想让你的计算更快,你需要更多的内存。
一个糟糕的选择可能是使用单打而不是双打。将矩阵创建为单个数组,现在它将需要4gb的RAM。它仍然会占用大量内存,但会稍微精简一些。代价当然是计算精度的损失。
2的评论
约翰D 'Errico
约翰D 'Errico 2017年12月28日
两个8gb阵列的副本需要16gb。不要忘记MATLAB本身会消耗一些RAM。所以不管怎么计算,只要你开始达到极限,你就会遇到问题。如果您的计算可以容忍使用单一,就往那个方向走。
如果您有一个实际的磁盘驱动器使用旋转盘片,您能做的最好的事情是将磁盘驱动器替换为SSD驱动器。这可以极大地提高VM访问速度,受限于内存和驱动器之间的总线速度。SSD驱动器没有那么贵。我的电脑很值得花这么多钱,能让我的电脑再愉快地运行几年。

登录发表评论。

更多的答案(2)

本杰明·克劳斯
本杰明·克劳斯 2017年12月28日
也许是时候开始研究并行计算工具箱或MATLAB中的一些新的大数据功能了(比如高数组)。一些链接可查看:

大卫·桑托斯
大卫·桑托斯 2019年8月20日
我建议您使用matfile将所有数据放在一个大的.mat矩阵中(不将所有数据加载到内存中,只将必要的数据加载到内存中),并按块处理,最好按列处理。
这样做可以控制放入内存中的数据量,并能够处理非常长的矩阵(> 1TB)。
如果您不需要访问所有数据,那么高数组是可以的,因为一旦增加访问次数,它就会比matfile慢
愿一切都好!

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!