我有一个循环,逐块创建一个稀疏数组。矩阵具有慷慨的预分配以加速构造。在构造稀疏数组之后是否可以(或必要)释放预分配的内存?
此代码的简要说明。稀疏矩阵a是T x P,并且shift是索引移位的R x Z x P矩阵。函数user_function应用移位,并使用求和重复索引的稀疏构造函数行为。在此总和之前,矩阵的大小是R * nnz(a),但是后面的大小更小。然后,阈值操作进一步减小结果的大小,使其舒适地适合记忆。
这种逐块构造似乎是避免在稀疏构造函数和阈值操作之前预先分配所有值的最佳方法。
alloc_size = 1000000000 / 8; % numerator is memory size of double array
out = spalloc(length(taxis), R * Z, alloc_size);
for rr = 1: R
% r index is the remainder value of modulus operator
savei = (0: (Z - 1)) * R + rr;
% user_function allocates 3 R * nnz(a) vectors
% result size is then reduced by repeated index summing and threshold
out(:, savei) = user_function(a, squeeze(shifts(rr, :, :)), theshold);
end
if nnz(out) > alloc_size
disp('exceeded number of preallocated results')
end