0

变量向量存储具有 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!现在由于太多额外的零,时间显然太大了。

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

4

1 回答 1

1

夏在这里评论

“顺便说一句,您是否尝试将 mlf 存储为列向量而不是行向量?sparse([],[],[],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 的稀疏矩阵使用三个向量进行遍历:一个存储非零条目的行索引。第二个以压缩方式存储列索引。最后,第三个向量存储每个条目的实际值。
第一个和最后一个向量的长度总是矩阵中非零元素的数量。但是,压缩后的第二个的长度为矩阵的列数,而与矩阵中非零元素的数量无关
因此,mlf2^31列转置到 1 对第二个向量的大小有很大的影响——这就是为什么时间会受到如此巨大的影响。

于 2013-10-27T12:55:23.070 回答