2012-10-23 38 views
9

Come convertire un Eigen::Matrix<double,Dynamic,Dynamic> in un Eigen::SparseMatrix<double>? Sto cercando un modo migliore invece di iterare attraverso la densa matriceEigen convertire la matrice densa in uno sparse

+0

Fammi capire questo. Vuoi convertire una matrice densa in una matrice sparsa senza verificare, quali voci sono zeri e devono essere eliminate e quali voci vuoi conservare? Come pensi che possa funzionare? Dovresti assolutamente lavorare su quella domanda - è molto chiaro. – angainor

+1

Senza controllare gli elementi manualmente. Sto cercando un metodo o una funzione o una libreria per farlo. Ma da quello che ho letto qui penso che non sia possibile – tyranitar

risposta

14

è possibile utilizzare il metodo sparseView() per questo:

sparse = dense.sparseView();

e anche specificare una tolleranza:

sparse = dense.sparseView(epsilon,reference);

1

Sei tu a controllare la creazione della matrice densa?

Se non lo fai, non c'è modo di farlo senza leggere ogni elemento matrix per vedere se è vuoto.

Se si sta creando la matrice densa da soli, è possibile creare una struttura dati per convertirla in sparse quando è necessario. Ad esempio, è possibile memorizzare con ciascuna riga della matrice il numero di elementi non nulli in quella riga. Quindi puoi saltare le righe con 0 elementi non nulli e puoi interrompere la conversione di qualsiasi riga una volta che hai visto tanti elementi non nulli come il conteggio ti dice.

Quali dati aggiuntivi vengono memorizzati dipende dai tipi di matrici sparse che ci si aspetta. Un comune schema a matrice sparsa è una sottomatrice densa che galleggia nella matrice sparsa. È impossibile modificare quelle regioni dense quando si crea la matrice densa. Per esempio. non memorizzare un conteggio di elementi per riga, ma piuttosto mantenere un elenco di regioni rettangolari non nulle a determinati x, y offset.

Problemi correlati