O Eigen SparseMatrix tem as funções:
- Matriz Esparsa (Índice, Índice)
- redimensionar(Índice, Índice)
- fazerCompress()
Quero armazenar uma matriz grande, mas (realmente) esparsa, usando Eigen. Chamar o construtor SparseMatrix(Index,Index)
aloca index^2
memória antes makeCompress()
de ser chamado? E quanto ao redimensionamento (int, int)? O que makeCompress()
faz então? Eu realmente quero evitar qualquer representação densa.
Não, ele armazena o tamanho lógico da matriz e aloca os metadados necessários, mas não aloca espaço além disso. O mesmo para
resize
O formato esparso usado pelo Eigen é Compressed Sparse Column (CSC) ou Row (CSR) , dependendo se você especifica a matriz como coluna principal ou linha principal. Eu explico o resto para o CSC.
O formato CSC compactado consiste em
Index
por coluna mais 1. Cada entrada fornece o deslocamento inicial dessa coluna nos outros dois vetoresO número de entradas diferentes de zero em uma coluna é calculado como o deslocamento do índice inicial dessa coluna até o índice da próxima coluna. É por isso que há uma entrada adicional.
No formato não compactado, os dois primeiros vetores possuem espaço livre no final de cada coluna, para que você possa anexar em tempo constante agregado. É armazenado um vetor adicional que fornece o final do intervalo usado por coluna.
Para concluir
Ambas as representações são esparsas. O descompactado precisa de mais memória, mas talvez duas vezes ou mais (dependendo da capacidade pré-alocada), não ao quadrado.
Normalmente, você começa com o formato descompactado. Em seguida insira novos valores, preferencialmente no final de cada linha/coluna. Então, no final, você pede
makeCompressed()
a representação final e mais compacta.