0

我有一个巨大的 (17GB) 矩阵中的太阳能数据,称之为 A。每一列代表一个站点,该站点在一年半的时间里收集了一秒钟的数据。这些站点在地面上是物理上的网格格式,并且(大致)对应于列号。我使用 9x9 矩阵(称为 B)中的站号表示布局,如下所示:

38     0    40     0    42     0    44     0    49
 0    28     0     0    30     0     0    33     0
37     0     5    10    15    20    25     0    48
 0     0     4     9    14    19    24     0     0
36    27     3     8    13    18    23    32    47
 0     0     2     7    12    17    22     0     0
35     0     1     6    11    16    21     0    46
 0    26     0     0    29     0     0    31     0
34     0    39     0    41     0    43     0    45

零是空白点。现在,我想将我的巨大矩阵 A 中的每一行表示为一个新的多维矩阵(称为 NewMat)的一个切片,其中 A 的列被“映射”到上面的 9x9 矩阵上。

我在一个循环中有以下内容:

for mm = 1:length(A) % rows

    for i = 1:length(HeaderStatNums) % column headers

        [j k] = find(B == HeaderStatNums(i));

        NewMat(j,k,mm) = A(mm,i+1); % This maps to the new matrix. (The i+1 is just 
                                    %  a shift
    end
end

这行得通,但是由于我的原始矩阵的大小,我无法在没有内存不足的情况下在 NewMat 中创建 A 的副本。我有 16GB 物理空间和大约 15GB 虚拟空间。因此,我只能将 A 的一部分复制到 NewMat 中。一种解决方案是加载和卸载存储矩阵的 MAT 文件,但这很笨重。有任何想法吗?

4

1 回答 1

0

关于这个问题的评论之一说,所有这些的原因是为了生成电影的帧。既然这是目标,我可以想到几个不同的选择:

  1. 生成一段有限时间跨度的电影,而不是数据集的整个时间跨度。那将使用更少的内存。

  2. 循环时将每个帧的数据写入文件,但不要将帧保存在内存中。然后您可以使用另一个函数来加载和显示帧。这样你就不会一次在内存中拥有两个数据副本。

于 2013-05-22T21:04:48.077 回答