matlab cell2mat(...)函数与具有一堆稀疏矩阵的单元阵列意外溢出内存

时间:2010-10-30 04:34:08

标签: matlab sparse-matrix numerics

我使用Matlab和cell2mat()函数得到了关于内存的奇怪行为......

我想做的是:

cell_array_outer = cell(1,N) 
parfor k = 1:N
  cell_array_inner = cell(1,M);   
  for i = 1:M
    A = do_some_math_and_return_a_sparse_matrix( );
    cell_array_inner{i} = sparse(A); % do sparse() again just to be paranoid
  end
  cell_array_outer{k} = sparse( cell2mat( cell_array_inner ) ); 
end

Giant_Matrix = cell2mat( cell_array_outer ); % DOH! 

但是唉,“DOH”指示的行使用了一些荒谬的内存量,超过了如果你把稀疏矩阵的大小加起来就应该结束了......就像它制作一个太大的中间结构一样。

以下工作正常,但双索引不适用于par-for,因此我只能使用一个核心:

cell_array_giant = cell(M,N) 
for k = 1:N   % cannot use parfor with {i,k} dual indices!

  for i = 1:M
    A = do_some_math_and_return_a_sparse_matrix( );
    cell_array_giant{i,k} = sparse(A); % do sparse() again just to be paranoid
  end
end

cell_array_giant = reshape( cell_array_giant, 1, M * N )
Giant_Matrix = sparse( cell2mat( cell_array_giant ) ); % Ok... but no parfor 

我怀疑在后一种情况下,每个单元格的大小更容易管理......就像20,000x1稀疏矩阵一样,但在前者中,那些“外部”元素现在是20,000 x 5,000,并且不知何故不适合Matlab希望将它们作为临时变量,尽管存在极大的稀疏性,但内存使用仍会失控。

关于内存使用和上述内容的任何规则?或者如何更改我的parfor使用,以便在第二种情况下进行评分? “parfor”是一种新的东西,所以网上关于它的内容比其他核心功能要少......比运行8份matlab更有效!

1 个答案:

答案 0 :(得分:0)

为了预测临时内存使用,我们必须更多地了解Matlab内部工作 - 我不知道。

对于你的第二个解决方案,你可以使用parfor,如果你在内循环中这样做,我想(我至少没有得到m-lint警告)。如果有必要,可以转移你的问题,使M> N,因为你通常希望parfor进行大量的快速计算,而不是很少的长计算,这样如果操作次数不足,你就会减少一些悬念。可以被8整除(或者你可以运行多少核心)。

cell_array_giant = cell(M,N) 
for k = 1:N   %# cannot use parfor with {i,k} dual indices!

  parfor i = 1:M %# but you can use it here!
    A = do_some_math_and_return_a_sparse_matrix( );
    cell_array_giant{i,k} = sparse(A); %# do sparse() again just to be paranoid
  end
end

另外,是否可以在k-loop内构建巨大的稀疏矩阵?这完全避免了重塑。当然,你只能parfor M-loop,否则,巨型阵列将被传递给所有工人,并且会产生很多悲伤。