我有一个 300x300 矩阵。我需要制作一个 300x300x1024 矩阵,其中每个“切片”都是原始的 300x300 矩阵。有没有办法在没有循环的情况下做到这一点?我尝试了以下方法:
老=G;
for j=2:N;
G(:,:,j)=old;
end
其中 N 是 1024,但我的内存不足。
知道更短的路线吗?
我有一个 300x300 矩阵。我需要制作一个 300x300x1024 矩阵,其中每个“切片”都是原始的 300x300 矩阵。有没有办法在没有循环的情况下做到这一点?我尝试了以下方法:
老=G;
for j=2:N;
G(:,:,j)=old;
end
其中 N 是 1024,但我的内存不足。
知道更短的路线吗?
使用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
查看可用内存是多少以及可以清除哪些变量。
您可能内存不足,因为您尚未预先初始化矩阵。
如果你先这样做,
old = G;
G = zeros(size(old,1), size(old,2), 1024);
然后从而1
不是开始循环2
,你可能不会用完内存
为什么这样做是因为您首先为整个矩阵留出了足够大的内存块。如果不初始化矩阵,matlab 首先为 300x300x1 矩阵留出足够的内存。接下来,当您添加第二个切片时,它会向下移动内存,并为 300x300x2 矩阵分配一个新块,依此类推,永远无法访问为第一个矩阵分配的内存。
这在 matlab 中经常发生,因此永远不要在循环中增长矩阵是很重要的。
快速回答是否定的,您将需要循环。
你也许可以做一些聪明的事情,比如块复制你的数组的内存,但你甚至没有给我们一种可以使用的语言。
您可能希望确保矩阵中的每个条目都是最小大小,即使是字节矩阵大小,您也需要 92mb,如果您存储的是 64 位值,我们几乎是在谈论一个 gig。如果它是一个对象,您的数字将立即跃入多演出范围。位打包可能会派上用场......但再次不知道你的其他限制是什么。
编辑:我更新了你的标签。
我不确定我是否能帮上大忙,但双打都是 64 位,所以至少你说的是 2gb(如果你在 32 位操作系统上,你已经不可能了)。如果每个单元格包含一个或两个指向不同内存位置的指针,这很容易翻倍(我对 matlab 的了解不够,无法确定地告诉你)。
如果您不在 8gb 64 位机器上运行,我认为您没有机会。如果是,请将所有内存分配给 matlab 并祈祷。
对不起,我不能提供更多帮助,也许其他人知道更多技巧。