A、B、C 和 D 是 361x361x120 双矩阵。当我尝试执行以下计算时出现内存不足错误:
Result = (A.*B)+(C.*D);
不幸的是,这些必须是双倍的,我需要以下结果来进行其余的计算。我试过分离加法步骤,但它卡在第一个乘法(A * .B)上。有没有办法进一步分解这些步骤以避免内存问题?
谢谢!
-N。
A、B、C 和 D 是 361x361x120 双矩阵。当我尝试执行以下计算时出现内存不足错误:
Result = (A.*B)+(C.*D);
不幸的是,这些必须是双倍的,我需要以下结果来进行其余的计算。我试过分离加法步骤,但它卡在第一个乘法(A * .B)上。有没有办法进一步分解这些步骤以避免内存问题?
谢谢!
-N。
您的命令似乎等同于:
C = nan(361,361,120);
for i = 1:361;
for j = 1:361;
C(i,j,:) = rand(120,1) .* rand(120,1);
end
end
除了这个命令使用更少的内存
发生的情况是,您的每个A
、B
、C
和D
矩阵都需要:361*361*120*8
bytes (or 119
MB) of contiguous memory。当您执行Result = (A.*B)+(C.*D);
时,两个中间结果和最终结果中的每一个也将需要相同数量的内存(尽管中间结果会在之后立即释放)。在高峰期,它需要 6 到 7 个连续内存块的空间,每个内存块大小为 119MB。(请记住,碎片如何影响任何时间点的最大可能分配矩阵的大小)
如果您没有足够的内存来保存以上所有内容,请clear
尽快重写表达式以重用现有变量和不再需要的变量。
否则,不要一次在内存中加载/存储所有数据。新版本的 MATLAB 允许您使用新matfile
函数加载/保存部分 MAT 文件。您将使用 for 循环在块中计算结果。
其他想法:如果您的数据包含很多零,请考虑使用稀疏矩阵。您还真的需要双精度吗,您可以改用single
类型将所需的内存减半。
当然,您总是可以转移到安装了 MATLAB 的 64 位机器上,并购买尽可能多的 RAM :)
因为您正在执行逐个元素的乘法,所以您可以使用循环简单地拆分操作。下面是如何将 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);