2013-03-14 143 views
1

我有一个300x300的矩阵。我需要制作一个300x300x1024的矩阵,其中每个“切片”是原始的300x300矩阵。有没有办法做到这一点没有循环?我试过以下内容:二维矩阵到一个3d矩阵而不使用循环

old = G;

for j=2:N; 

    G(:,:,j)=old; 

end 

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

知道任何较短的路线?

回答

-1

快速回答是否定的,您需要循环。

你可能可以做一些聪明的事情,比如块复制你的数组的内存,但是你甚至没有给我们一种语言来处理。

如果你正在存储一个64位的值,我们几乎要演出,你可能会想要确保矩阵中的每个条目都是最小尺寸,即使在字节矩阵大小下,也需要92mb。如果这是一个对象,你的号码将立即跳入多个范围。位打包可能会派上用场......但是再次不知道你的其他约束是什么。

编辑:我更新了你的标签。

我不确定我是否可以提供很多帮助,但双打每个都是64位,所以在最低限度上,你正在谈论2GB(如果你在32位系统上,你已经不可能实现)。如果每个单元格包含一个或两个指向不同内存位置的指针(我不太了解matlab以确切地告诉您),那么这可能会轻松地加倍。

如果你不是在8GB 64位机上运行,​​我认为你没有机会。如果你是,分配所有的内存,你可以matlab和祈祷。

对不起,我不能有更多的帮助,也许别人知道更多的技巧。

+0

啊对不起,我忘了提及它是matlab。它是高斯脉冲的数据,所以没有obj,只是双倍。但仍然,快速起床 – Matthew 2013-03-14 19:27:44

4

使用repmat

B = repmat(A,[m n p...]) 

产生A的拷贝组成的多维数组B B的大小为[大小(A,1)* M,尺寸(A,2)* n个,尺寸(A,3)* P ,...]。

在你的情况,

G=repmat(old,[1 1 1024]); 

会产生你不想要的for循环的结果。记忆问题是一个完全不同的主题。一个300x300x1024的双矩阵将“花费”你〜740 MB的内存,这些日子并不多。在尝试repmat之前检查你的内存负载,看看为什么你没有这些额外的700 MB。使用memorywhos来查看可用内存和可以清除哪些变量。

0

由于您未预先初始化您的矩阵,因此可能内存不足。

如果你这样做第一,

old = G; 
G = zeros(size(old,1), size(old,2), 1024); 

,然后开始从1而不是2循环,你可能不会出现内存不足的

为什么这个工作是因为你先抛开足够整个矩阵的内存块。如果你不初始化矩阵,matlab首先为300x300x1矩阵留出足够的内存空间。接下来,当您添加第二个切片时,它会向下移动内存,并为300x300x2矩阵分配一个新块,等等,永远不能访问为第一个矩阵分配的内存。

这经常发生在matlab中,所以重要的是永远不要在循环内增长矩阵。