2012-10-23 8 views
9

Jak przekonwertować Eigen::Matrix<double,Dynamic,Dynamic> na Eigen::SparseMatrix<double>? Szukam lepszego sposobu zamiast iteracji poprzez gęstą macierz.Eigen przekształca gęstą matrycę w rzadką jedną

+0

Pozwól mi to zrozumieć. Chcesz przekonwertować gęstą macierz na rzadką macierz bez sprawdzania, które pozycje są zerami i które powinny zostać usunięte oraz jakie wpisy chcesz zachować? Jak myślisz, jak to może działać? Powinieneś zdecydowanie popracować nad tym pytaniem - jest to bardzo niejasne. – angainor

+1

Bez sprawdzania elementów ręcznie. Poszukuję metody lub funkcji lub biblioteki, aby to zrobić. Ale z tego, co tu przeczytałem, myślę, że nie jest to możliwe – tyranitar

Odpowiedz

14

można użyć metody sparseView() W tym:

sparse = dense.sparseView();

a nawet określić tolerancję:

sparse = dense.sparseView(epsilon,reference);

1

Czy kontrolujesz tworzenie gęstej matrycy?

Jeśli nie, to nie można tego zrobić bez czytania każdego elementu macierzy, aby sprawdzić, czy jest pusty.

Jeśli tworzysz gęstą matrycę samodzielnie, możesz utworzyć strukturę danych, aby przekształcić ją w rzadką, kiedy zajdzie taka potrzeba. Można na przykład zapisać w każdym wierszu macierzy liczbę elementów innych niż zero w tym wierszu. Wtedy możesz pominąć wiersze z 0 elementami innymi niż null i możesz przerwać konwersję dowolnego wiersza, gdy zobaczysz tyle nie-pustych elementów, ile wskazuje liczba.

Jakie dodatkowe przechowywane dane będą zależne od typów rzadkich macierzy, jakich się spodziewasz. Powszechny rzadki wzorzec macierzy to gęste submaterie unoszące się w rzadkiej macierzy. Gdy tworzysz gęstą matrycę, możesz usunąć te gęste rejony. Na przykład. nie przechowuj liczby elementów w wierszu, ale raczej zachowaj listę niepustych prostokątnych regionów przy pewnych przesunięciach x, y.