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 のスパース行列は、3 つのベクトルを使用してストされます。1 つはゼロ以外のエントリの行インデックスを格納します。2 番目は列インデックスを格納しますが、圧縮された方法で行われます。最後に、3 番目のベクトルには、各エントリの実際の値が格納されます。
最初と最後のベクトルは常に、行列内の非ゼロ要素の数として長さを持ちます。ただし、圧縮された 2 番目のものは、行列内のゼロ以外の要素の数に関係なく、行列の列の数として長さを持ちます。したがって、列から 1 への
転置は、2 番目のベクトルのサイズに大きな影響を与えます。これが、タイミングが大幅に影響を受ける理由です。mlf2^31

于 2013-10-27T12:55:23.070 に答える