将矩阵列重塑为多维矩阵

时间:2013-05-22 18:30:24

标签: matlab bigdata reshape

我有一个巨大的(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文件,但这很笨重。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

关于这个问题的一个评论说,所有这一切的原因是生成电影的帧。由于这是目标,我可以考虑几个不同的选择:

  1. 在一段有限的时间范围内生成电影,而不是数据集的整个时间范围。那会少用内存。

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