变量向量存储具有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!现在时间太大了,显然是因为有太多额外的零点。
如何管理大变量向量来存储稀疏信息?
答案 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会对第二个向量的大小产生巨大影响 - 这就是时间受到如此严重影响的原因。