我有一个巨大的(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文件,但这很笨重。有什么想法吗?
答案 0 :(得分:0)
关于这个问题的一个评论说,所有这一切的原因是生成电影的帧。由于这是目标,我可以考虑几个不同的选择:
在一段有限的时间范围内生成电影,而不是数据集的整个时间范围。那会少用内存。
在循环时将每个帧的数据写入文件,但不要将帧保留在内存中。然后您可以使用另一个函数来加载和显示帧。这样,您就不会同时在内存中存储两份数据。