我有300x300矩阵。我需要制作一个300x300x1024矩阵,其中每个“切片”是原始的300x300矩阵。没有循环有没有办法做到这一点?我尝试了以下方法:
旧= G;
for j=2:N;
G(:,:,j)=old;
end
其中N是1024,但我的内存不足。
知道任何较短的路线吗?
答案 0 :(得分:4)
使用repmat
。
B = repmat(A,[m n p...])
产生由A的副本组成的多维数组B.B的大小是[size(A,1)* m,size(A,2)* n,size(A,3)* p,... ]
在你的情况下,
G=repmat(old,[1 1 1024]);
如果没有for循环,将产生您想要的结果。记忆问题是一个完全不同的主题。一个300x300x1024双矩阵将“花费”你~740 MB的内存,这些日子并不是很多。在尝试repmat
之前检查一下内存负载,看看为什么没有这些额外的700 MB。使用memory
和whos
查看可用内存是什么以及可以清除哪些变量。
答案 1 :(得分:0)
由于您尚未预先初始化矩阵,因此可能内存不足。
如果你先这样做,
old = G;
G = zeros(size(old,1), size(old,2), 1024);
然后从1
而不是2
开始循环,你可能不会耗尽内存
为什么这样做是因为你首先留出一块足够大的内存块用于整个矩阵。如果你没有初始化矩阵,matlab首先会为300x300x1矩阵留出足够的内存。接下来,当您添加第二个切片时,它向下移动内存,并为300x300x2矩阵分配新块,依此类推,永远无法访问为第一个矩阵分配的内存。
这通常发生在matlab中,所以永远不要在循环中增长矩阵。
答案 2 :(得分:-1)
快速回答是否定的,你需要循环。
你可以做一些聪明的事情,就像块复制数组的内存一样,但你甚至没有给我们一种语言来处理。
您可能希望确保矩阵中的每个条目都是最小大小,即使在字节矩阵大小,您将需要92mb,如果您存储的是64位值,我们几乎都在谈论。如果它是一个物体,你的数字将很快跃入许多演出范围。比特打包可能派上用场......但又不知道你的其他限制是什么。
编辑:我更新了您的代码。
我不确定我是否可以提供多少帮助,但是双打都是64位,所以至少你说的是2gb(如果你使用32位操作系统,你已经不可能了)。如果每个单元格涉及到一个或两个指向不同内存位置的指针,这可能很容易加倍(我不太了解matlab肯定会告诉你)。
如果你没有在8GB的64位机器上运行,我认为你没有机会。如果你是的话,把所有的记忆分配到matlab并祈祷。
抱歉,我无法提供更多帮助,也许别人知道更多技巧。