0

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

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

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

谢谢!

-N。

4

3 回答 3

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

除了这个命令使用更少的内存

于 2012-08-08T00:02:53.103 回答
0

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

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

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

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

当然,您总是可以转移到安装了 MATLAB 的 64 位机器上,并购买尽可能多的 RAM :)

于 2012-08-07T21:38:12.683 回答
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); 
于 2012-08-07T18:42:19.570 回答