2012-08-07 118 views
0

A,B,C和D是361x361x120双矩阵。 我得到一个内存不足的错误,当我尝试执行以下计算:内存错误:乘以大矩阵

Result = (A.*B)+(C.*D); 

不幸的是,这些都必须在双和我需要为我的计算其余以下结果。我试过分离加法步骤,但它被卡在第一个乘法(A * .B)上。是否有某种方法可以进一步分解这些步骤以避免内存问题?

谢谢!

-N。

+0

请添加适当的语言标记。 – 2012-08-07 18:13:59

+0

谢谢。添加。 – 2012-08-07 18:35:54

+0

也许交换空间实际上是你需要的。 – 2013-10-25 15:45:11

回答

0

因为你正在做一个元素乘以元素,你可以简单地使用循环分割操作。下面是如何繁殖A和B,并将结果保存到矩阵C的例子:

A = rand(361, 361, 120); 
B = rand(361, 361, 120); 
C = nan(361,361,120); 

for i = 1:size(A,1); 
    for j = 1:size(A,2); 
    C(i,j,:) = A(i,j,:) .* B(i,j,:); 
    end 
end 

你应该能够得到它与一个循环,而不是两个嵌套循环工作。

我不知道为什么你会得到一个内存不足的错误,但以下在我的机器上执行罚款。另外,乘法不应该需要太多内存。

A = rand(361, 361, 120); 
B = rand(361, 361, 120); 
C = rand(361, 361, 120); 
D = rand(361, 361, 120); 

E = (A.*B) + (C.*D); 
+0

谢谢,这个作品很棒。但是,只有当维度高于某个阈值时,这会在我的代码中进一步导致问题。我也怀疑过内存问题。这些是我的统计数据:最大可能数组:651 MB(6.826e + 08字节)* 内存可用于所有阵列:1215 MB(1.274e + 09字节)** MATLAB使用的内存:588 MB(6.161e + 08字节) 物理内存(RAM):5940 MB(6.228e + 09字节) – 2012-08-07 18:52:16

+0

嗯,问题是我有一些其他变量保存在工作区(我需要的所有这些变量),这明显推动它超过阈值。 – 2012-08-07 19:01:40

+0

您的每个'361x361x120'变量都是120 MB的内存。因此,在内存中有“A,B,C,D,E”占用了近600 MB。看看你的代码,找出你不再需要变量并删除它,或者购买更多的RAM。 – slayton 2012-08-07 19:03:15

0

发生了什么事是每个ABCD矩阵的要求:的连续内存361*361*120*8字节(或119 MB)。执行Result = (A.*B)+(C.*D);时,两个中间结果和最终结果中的每一个都需要相同的内存量(尽管之后会立即释放中间结果)。在高峰时,它需要空间用于每个大小为119MB的6到7个连续内存块(请记住如何在任何时间点影响最大可能分配矩阵的大小)

如果您没有足够的内存来保存所有上述内容,请重写表达式以重用现有变量,并尽快不再需要这些变量。

否则,请不要一次在内存中加载/存储所有数据。 MATLAB的新版本允许您使用新的matfile函数加载/保存部分MAT文件。您将使用for-loops计算块的结果。

其他想法:如果数据包含很多零,请考虑使用稀疏矩阵。另外你是否真的需要双精度,你可以将使用single类型所需的内存减半。

当然,你总是可以迁移到64位机与匹配MATLAB安装,购买尽可能多的RAM,你能负担得起:)

+0

感谢您的帮助! – 2012-08-08 19:20:45

0

你的命令似乎是相同的:

C = nan(361,361,120); 
    for i = 1:361; 
     for j = 1:361; 
     C(i,j,:) = rand(120,1) .* rand(120,1); 
     end 
    end 

除了这个命令使用大大减少内存

+0

感谢您的帮助! – 2012-08-08 19:21:22