2017-01-11 10 views
0

мне было интересно, если метод reserve в Эйгене делает также выделяет память для внешних индексов и внутренних индексов (в случае 3-CSC.)Эйген разреженного матрица резерв NNZ

Это означает, что если я сделать

n = 1000 
SparseMatrix<float> A; 
A.reserve(n) 

затем

  • Алло Cate n память данных
  • выделить n памяти для внутренних индексов
  • выделить n+1 памяти для внешних индексов (в худшем случае и априори не известно)

документация говорит только

void Eigen::SparseMatrix<...>::reserve (Index reserveSize) 

Предоставляет резервные копии без нулей.

Условие: матрица должна быть в сжатом режиме.


Может кто-нибудь разъяснить это? Или сказать что-то о политике резервирования? Спасибо

ответ

0

Нет, размеры матрицы должны быть довольно статичными, поэтому reserve(n) выделяет пространство для не нулей. Если размер неизвестен, вы можете начать с верхней границей:

SparseMatrix<float> A(n,n); 

резерва, например:

A.reserve(10*n); 

и как только вы сделали, и что вы знаете, окончательный размер, уменьшить его:

A.conservativeResize(rows,cols); 
+0

, так что, если я знаю, размеры в начале говорят 'SparseMatrix A (m, m); A.reserve (n); 'then ** внутренние индексы ** и ** данные ** захват' n' памяти и ** внешние индексы ** захватывает память 'm + 1'? –

+0

Первая часть является истинной, но не последней: память для внешних индексов выделяется и инициализируется конструктором A (m, m). 'reserve' ничего не делает с уважением к внешним индексам. – ggael

+0

большое спасибо. возможно, вы должны отредактировать и включить это в свой ответ. –