0

boostcompressed_matrixによってどのくらいのスペースが割り当てられますか?ゼロ以外の要素にのみスペースを割り当てるというのは本当ですか?これが本当なら、次のコードがbad_allocエラーを出す理由がわかりません。

namespace bubla = boost::numeric::ublas; 
typedef double value_type; 
typedef bubla::compressed_matrix<value_type> SparseMatrix; 
unsigned int m = 10000*10000; 
SparseMatrix D(m,m,3*m), X; 

3 * m = 3 * 10000 * 10000要素にのみスペースを割り当てる必要がありますか?

明確にするのを手伝っていただけませんか?ゼロ以外の要素にのみスペースを割り当てるために使用できるブーストのデータ構造。次に、ゼロ以外の要素の値を設定するにはどうすればよいですか?

どうもありがとう。

4

3 に答える 3

1

CRSフォーマット

まず、圧縮形式について 1 分間紹介します。与えられたマトリックス

+---+---+---+---+
| A | 0 | B | 0 |
+---+---+---+---+
| 0 | C | 0 | 0 |
+---+---+---+---+
| 0 | 0 | D | E |
+---+---+---+---+

ublas::compressed_matrix行ごとのゼロ以外の数、列インデックス、およびゼロ以外の各エントリの値を保存すると、圧縮行ストレージ (CRS) 形式 (の既定の形式) で非常に効率的に保存できます。

                     +---+---+---+
number of non-zeros  | 2 | 1 | 2 |
                     +---+---+---+
                     +---+---+---+---+---+
column index         | 0 | 2 | 1 | 2 | 3 |
                     +---+---+---+---+---+
                     +---+---+---+---+---+
value                | A | B | C | D | E |
                     +---+---+---+---+---+

注:さまざまなバリエーションがあります。たとえば、ゼロ以外の数 (NNZ) の代わりに、各行の最初の要素へのインデックスをcolumn indexおよびvalueベクトルに格納することもできます。または、これらの値へのポインターを新しい行の開始位置などに格納することもできます。ただし、それらはすべて多かれ少なかれ同じ量のメモリを必要とします。

メモリ要件

CRSフォーマットに必要なメモリはおおよそ

memoryRequired = numberOfRows * sizeof(index_type) 
                 + NNZ * sizeof(index_type) 
                 + NNZ * sizeof(value_type)

さらに、配列の長さ、データへのポインターなどを格納するためのオーバーヘッドが発生します。ただし、データ自体が必要とするメモリと比較すると、圧縮された行列は非常に大きくなる傾向があるという事実 (それ以外の場合は密な行列を使用できます) を考えると、このオーバーヘッドは通常無視できます。

あなたの例では

m行、m列、3*mゼロ以外のエントリを含む CRS 行列を で割り当てようとしmてい10^8ます。uint32インデックスにdoubleas type を使用し、エントリに as typeを使用すると仮定すると、これには次の量のメモリが必要になります。

NNZ vector              m * 4 =  381.5 MB
column index vector   3*m * 4 = 1144.4 MB
value vector          3*m * 8 = 2288.8 MB
-----------------------------------------
total                           3814.7 MB

そのため、既にマトリックスには約 4 GB のメモリが必要です。いくつかのベクトルも保存したい場合、従来のデスクトップ マシンではすぐにメモリ不足になります。

于 2012-07-26T10:42:31.827 に答える
1

上記の例では、m を 10000*10000 に定義していることに注意してください。つまり、3 億倍精度または 2.4 GB を割り当てようとしています (倍精度あたり 8 バイトを想定)。

まばらな 10000 x 10000 マトリックスが必要な場合は、「m=10000」と定義してください。

于 2010-09-20T19:56:24.467 に答える
0

3*m = 300000000

于 2010-09-20T19:42:10.420 に答える