2012-10-23 4 views
9

Wie konvertiert man eine Eigen::Matrix<double,Dynamic,Dynamic> in eine Eigen::SparseMatrix<double>? Ich bin auf der Suche nach einem besseren Weg statt iterieren durch die dichte MatrixEigen konvertieren dichte Matrix zu spärlich

+0

Lassen Sie mich verstehen. Sie möchten eine dichte Matrix ohne Überprüfung in eine dünn besetzte Matrix umwandeln, welche Einträge sind Nullen und sollten gelöscht werden, und welche Einträge möchten Sie behalten? Wie könnte das funktionieren? Sie sollten auf jeden Fall an dieser Frage arbeiten - es ist sehr unklar. – angainor

+1

Ohne die Elemente manuell prüfen. Ich suche nach einer Methode oder einer Funktion oder einer Bibliothek, um dies zu tun. Aber von dem, was ich hier gelesen habe, denke ich, dass es nicht möglich ist – tyranitar

Antwort

14

können Sie die sparseView() Methode für die Verwendung:

sparse = dense.sparseView();

und sogar eine Toleranz angeben:

sparse = dense.sparseView(epsilon,reference);

1

Steuern Sie die Erstellung der dichten Matrix?

Wenn Sie dies nicht tun, gibt es keine Möglichkeit, dies zu tun, ohne jedes Matrixelement zu lesen, um zu sehen, ob es leer ist.

Wenn Sie die dichte Matrix selbst erstellen, können Sie eine Datenstruktur erstellen, um sie bei Bedarf in spärliche Daten umzuwandeln. Sie könnten beispielsweise mit jeder Matrixzeile die Anzahl der Nicht-Null-Elemente in dieser Zeile speichern. Dann könnten Sie Zeilen mit 0 Nicht-Null-Elementen überspringen und Sie könnten die Konvertierung jeder Zeile stoppen, sobald Sie so viele Nicht-Null-Elemente gesehen haben, wie Ihnen die Zählung sagt.

Welche zusätzlichen Daten Sie speichern, hängt von den Typen der dünn besetzten Matrizen ab, die Sie erwarten. Ein häufiges dünnes Matrixmuster sind dichte Submatrizen, die in der spärlichen Matrix schweben. Sie können diese dichten Regionen nicht erstellen, wenn Sie die dichte Matrix erstellen. Z.B. Speichern Sie keine Elementanzahl pro Zeile, sondern behalten Sie eine Liste von rechteckigen Bereichen, die nicht Null sind, bei bestimmten x, y-Offsets bei.