1

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

老=G;

for j=2:N;

    G(:,:,j)=old;

end

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

知道更短的路线吗?

4

3 回答 3

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查看可用内存是多少以及可以清除哪些变量。

于 2013-03-14T20:21:00.577 回答
0

您可能内存不足,因为您尚未预先初始化矩阵。

如果你先这样做,

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

然后从而1不是开始循环2,你可能不会用完内存

为什么这样做是因为您首先为整个矩阵留出了足够大的内存块。如果不初始化矩阵,matlab 首先为 300x300x1 矩阵留出足够的内存。接下来,当您添加第二个切片时,它会向下移动内存,并为 300x300x2 矩阵分配一个新块,依此类推,永远无法访问为第一个矩阵分配的内存。

这在 matlab 中经常发生,因此永远不要在循环中增长矩阵是很重要的。

于 2013-03-14T20:37:09.580 回答
-1

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

你也许可以做一些聪明的事情,比如块复制你的数组的内存,但你甚至没有给我们一种可以使用的语言。

您可能希望确保矩阵中的每个条目都是最小大小,即使是字节矩阵大小,您也需要 92mb,如果您存储的是 64 位值,我们几乎是在谈论一个 gig。如果它是一个对象,您的数字将立即跃入多演出范围。位打包可能会派上用场......但再次不知道你的其他限制是什么。

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

我不确定我是否能帮上大忙,但双打都是 64 位,所以至少你说的是 2gb(如果你在 32 位操作系统上,你已经不可能了)。如果每个单元格包含一个或两个指向不同内存位置的指针,这很容易翻倍(我对 matlab 的了解不够,无法确定地告诉你)。

如果您不在 8gb 64 位机器上运行,我认为您没有机会。如果是,请将所有内存分配给 matlab 并祈祷。

对不起,我不能提供更多帮助,也许其他人知道更多技巧。

于 2013-03-14T19:22:25.653 回答