内存错误:乘以大型矩阵

时间:2012-08-07 18:00:09

标签: matlab matrix out-of-memory matrix-multiplication

A,B,C和D是361x361x120双矩阵。 当我尝试执行以下计算时出现内存不足错误:

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

不幸的是,这些必须是双倍的,我需要在计算的其余部分得到以下结果。我已经尝试分离添加步骤,但它会卡在第一次乘法(A * .B)上。有没有办法进一步分解这些步骤以避免内存问题?

谢谢!

N。

3 个答案:

答案 0 :(得分: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); 

答案 1 :(得分:0)

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

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

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

其他想法:如果您的数据包含大量零,请考虑使用稀疏矩阵。你真的需要双精度,你可以改为使用single类型所需的内存减半。

当然,您可以随时移动到具有匹配MATLAB安装的64位计算机,并购买尽可能多的RAM:)

答案 2 :(得分: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

除此命令使用的内存少得多