我有一个300x300的矩阵。我需要制作一个300x300x1024的矩阵,其中每个“切片”是原始的300x300矩阵。有没有办法做到这一点没有循环?我试过以下内容:二维矩阵到一个3d矩阵而不使用循环
old = G;
for j=2:N;
G(:,:,j)=old;
end
其中N是1024,但内存不足。
知道任何较短的路线?
我有一个300x300的矩阵。我需要制作一个300x300x1024的矩阵,其中每个“切片”是原始的300x300矩阵。有没有办法做到这一点没有循环?我试过以下内容:二维矩阵到一个3d矩阵而不使用循环
old = G;
for j=2:N;
G(:,:,j)=old;
end
其中N是1024,但内存不足。
知道任何较短的路线?
快速回答是否定的,您需要循环。
你可能可以做一些聪明的事情,比如块复制你的数组的内存,但是你甚至没有给我们一种语言来处理。
如果你正在存储一个64位的值,我们几乎要演出,你可能会想要确保矩阵中的每个条目都是最小尺寸,即使在字节矩阵大小下,也需要92mb。如果这是一个对象,你的号码将立即跳入多个范围。位打包可能会派上用场......但是再次不知道你的其他约束是什么。
编辑:我更新了你的标签。
我不确定我是否可以提供很多帮助,但双打每个都是64位,所以在最低限度上,你正在谈论2GB(如果你在32位系统上,你已经不可能实现)。如果每个单元格包含一个或两个指向不同内存位置的指针(我不太了解matlab以确切地告诉您),那么这可能会轻松地加倍。
如果你不是在8GB 64位机上运行,我认为你没有机会。如果你是,分配所有的内存,你可以matlab和祈祷。
对不起,我不能有更多的帮助,也许别人知道更多的技巧。
使用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。使用memory
和whos
来查看可用内存和可以清除哪些变量。
由于您未预先初始化您的矩阵,因此可能内存不足。
如果你这样做第一,
old = G;
G = zeros(size(old,1), size(old,2), 1024);
,然后开始从1
而不是2
循环,你可能不会出现内存不足的
为什么这个工作是因为你先抛开足够整个矩阵的内存块。如果你不初始化矩阵,matlab首先为300x300x1矩阵留出足够的内存空间。接下来,当您添加第二个切片时,它会向下移动内存,并为300x300x2矩阵分配一个新块,等等,永远不能访问为第一个矩阵分配的内存。
这经常发生在matlab中,所以重要的是永远不要在循环内增长矩阵。
啊对不起,我忘了提及它是matlab。它是高斯脉冲的数据,所以没有obj,只是双倍。但仍然,快速起床 – Matthew 2013-03-14 19:27:44