2d矩阵到3d矩阵而不使用循环

时间:2013-03-14 19:15:10

标签: matlab matrix 3d 2d vectorization

我有300x300矩阵。我需要制作一个300x300x1024矩阵,其中每个“切片”是原始的300x300矩阵。没有循环有没有办法做到这一点?我尝试了以下方法:

旧= G;

for j=2:N;

    G(:,:,j)=old;

end

其中N是1024,但我的内存不足。

知道任何较短的路线吗?

3 个答案:

答案 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。使用memorywhos查看可用内存是什么以及可以清除哪些变量。

答案 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并祈祷。

抱歉,我无法提供更多帮助,也许别人知道更多技巧。