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。
因为你正在做一个元素乘以元素,你可以简单地使用循环分割操作。下面是如何繁殖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);
谢谢,这个作品很棒。但是,只有当维度高于某个阈值时,这会在我的代码中进一步导致问题。我也怀疑过内存问题。这些是我的统计数据:最大可能数组: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
嗯,问题是我有一些其他变量保存在工作区(我需要的所有这些变量),这明显推动它超过阈值。 – 2012-08-07 19:01:40
您的每个'361x361x120'变量都是120 MB的内存。因此,在内存中有“A,B,C,D,E”占用了近600 MB。看看你的代码,找出你不再需要变量并删除它,或者购买更多的RAM。 – slayton 2012-08-07 19:03:15
发生了什么事是每个A
,B
,C
和D
矩阵的要求:的连续内存361*361*120*8
字节(或119
MB)。执行Result = (A.*B)+(C.*D);
时,两个中间结果和最终结果中的每一个都需要相同的内存量(尽管之后会立即释放中间结果)。在高峰时,它需要空间用于每个大小为119MB的6到7个连续内存块(请记住如何在任何时间点影响最大可能分配矩阵的大小)
如果您没有足够的内存来保存所有上述内容,请重写表达式以重用现有变量,并尽快不再需要这些变量。
否则,请不要一次在内存中加载/存储所有数据。 MATLAB的新版本允许您使用新的matfile
函数加载/保存部分MAT文件。您将使用for-loops计算块的结果。
其他想法:如果数据包含很多零,请考虑使用稀疏矩阵。另外你是否真的需要双精度,你可以将使用single
类型所需的内存减半。
当然,你总是可以迁移到64位机与匹配MATLAB安装,购买尽可能多的RAM,你能负担得起:)
感谢您的帮助! – 2012-08-08 19:20:45
你的命令似乎是相同的:
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-08 19:21:22
请添加适当的语言标记。 – 2012-08-07 18:13:59
谢谢。添加。 – 2012-08-07 18:35:54
也许交换空间实际上是你需要的。 – 2013-10-25 15:45:11