Matlab中的多维数组或单元数组?

时间:2017-03-20 14:03:52

标签: matlab

我想在维度A的Matlab中创建一个多维数组NxMxGN,M,G非常大(例如10^6)。

然后我需要在循环中访问A

for g=1:G
    Atemp=A(:,:,g);
    %etc etc
end

在多维数组或单元数组中存储A的值时,在速度和内存方面更方便吗?

3 个答案:

答案 0 :(得分:1)

  1. 如果您总是以相同的方式循环 slices ,并按照您的代码似乎建议一次处理一个 slice ,那么性能应该大致相当。
  2. 如果你真的想存储1e6x1e6x1e6 double,那么Matlab 可能不是你的工具。但是,如果 slices 是稀疏的,那么将它们存储为单元格数组可能会更高效,因此当“切割”时,Matlab不必搜索完整的3D空间 切片,而Atemp=A{g};只是复制稀疏矩阵。
  3. 如果您正在处理完整(非稀疏)切片,那么您可能应该将切片加载/保存到磁盘并使用从文件加载的函数/支持类:Atemp=A(g);。请注意,文本加载比加载二进制文件花费的时间要长得多:所以请仔细选择文件格式!

答案 1 :(得分:0)

如果使用数字,则使用多维数组是正确的。单元阵列也允许其他类型,因此不仅仅针对数字进行优化。因为您使用的是非常大的数组,所以sparse matrix可能适合您。

答案 2 :(得分:0)

首先,请注意,两个选项都不允许您处理10 ^ 18个值。你不会有exabytes的存储空间,更不用说内存了。

如果你只使用Atemp = A(:,:,g);作为Atemp = squeeze(A(:,g,:));,对于所有g,N和M的大小始终相同,对于多维或单元格而言,就性能而言,不应该改变任何有意义的东西。 N-D可能会快一点,但没什么重要的。

显然,如果您想要根据g进行不同大小的N,M的计算,则需要选择单元阵列。如果你想用A(:,:,g)进行计算,那么N-D数组就是明确的选择。

因此,选择最有可能取决于您是否愿意执行A{g};A(:,:,g),这取决于您的数据含义。假如你有天气数据并且目前只关心在特定高度发生的事情(不是层之间发生的事情),read -p显然更明智。您可能需要在某个时刻进行层间计算。但是,如果您有g意味着不同的测量站点收集数据,则应使用A {g}来选择站点。最终你可能会有一些网站变大或变小。