Matlab:如何使用稀疏命令管理大量稀疏数据?

时间:2013-10-26 17:39:32

标签: matlab data-structures initialization dynamic-data sparse-matrix

变量向量存储具有31个变量的多线性函数,例如

>> tic; mlf=sparse(1,2^31)
toc
tic; mlf(1)=7
toc

mlf =

   All zero sparse: 1-by-2147483648

Elapsed time is 1.075814 seconds.

mlf =

                  (1,1)                       7

Elapsed time is 15.468432 seconds.

其中包含多线性函数中的所有可能项,例如常量,$ x_1 $,x_2x_31 $和$ x_30x_31 $。然而,这种启动和特别分配需要花费太长时间 - 约1秒和15秒 - 实际上每个mlf只有大约1-20个术语,所以甚至不接近2147483648!现在时间太大了,显然是因为有太多额外的零点。

  

如何管理大变量向量来存储稀疏信息?

1 个答案:

答案 0 :(得分:1)

Shai评论here

  

“BTW,你有没有尝试将mlf存储为列向量而不是行向量?稀疏([],[],[],2 ^ 31,1,500);如果我没有弄错这个使用Matlab的稀疏矩阵的内部表示应该更容易处理。“

那就做到了!

>> tic;sparse([],[],[],2^31,1);toc 
Elapsed time is 0.549435 seconds.
>> tic;sparse([],[],[],1,2^31);toc 
Elapsed time is 15.102854 seconds.

惊人!

为什么会这样?

(如果我允许这么直接编辑帖子)Matlab的稀疏矩阵使用三个向量进行调整:一个存储非零条目的行索引。第二个存储列索引但以压缩方式。最后,第三个向量存储每个条目的实际值 第一个和最后一个向量的长度始终为矩阵中非零元素的数量。但是,压缩的第二个长度为矩阵的列数,而不管矩阵中非零元素的数量
因此,将mlf列从2^31列转换为1会对第二个向量的大小产生巨大影响 - 这就是时间受到如此严重影响的原因。