A,B,C和D是361x361x120双矩阵。 当我尝试执行以下计算时出现内存不足错误:
Result = (A.*B)+(C.*D);
不幸的是,这些必须是双倍的,我需要在计算的其余部分得到以下结果。我已经尝试分离添加步骤,但它会卡在第一次乘法(A * .B)上。有没有办法进一步分解这些步骤以避免内存问题?
谢谢!
N。
答案 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)
正在发生的事情是,您的A
,B
,C
和D
矩阵中的每一个都需要: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
除此命令使用的内存少得多