【发布时间】:2019-08-12 19:07:25
【问题描述】:
我在 MATLAB 中运行仿真时遇到了内存不足的问题。
举个简单的例子,假设我有一个 MATLAB 表/矩阵/向量集合,如下所示:
id | t | var
----+---+-----
1 | 1 | 100
1 | 2 | 150
2 | 2 | 200
2 | 3 | 90
2 | 4 | 980
其中id 表示个人,t 表示时间段,var 是一个数值变量。
随着时间的推移t,我需要对给定个体id 的不同值求和var。我能找到的最简单的方法是运行以下命令:
idx = sparse(id == id');
sumvar = idx*sumvar;
产生所需结果(与var 长度相同的向量,其中每个元素是给定id 的总和)。
id | t | var | sumvar
----+---+-----+--------
1 | 1 | 100 | 250
1 | 2 | 150 | 250
2 | 2 | 200 | 1270
2 | 3 | 90 | 1270
2 | 4 | 980 | 1270
问题是计算idx 是非常计算机密集型的,并且我的计算机使用大约 150,000 个向量时内存不足。
一种可能的解决方案是使用以下代码:
len = length(id);
idx = sparse(len,len);
for i = 1:len
idx(id == id(i),:) = 1;
end
但这似乎很慢。
我觉得这是其他人可能已经面临的问题。有没有什么东西可以既非计算密集型又足够快?
【问题讨论】: