dla klasy Muszę napisać własną liniową procedurę rozwiązywania równań dla macierzy rzadkich. Mam swobodę korzystania z dowolnej struktury danych dla rzadkich macierzy i muszę zaimplementować kilka rozwiązań, w tym koniugować gradient.Mnożenie małej macierzy rzadkiej
Zastanawiam się, czy istnieje znany sposób przechowywania rzadkich matryc, tak że mnożenie za pomocą wektora jest stosunkowo szybkie.
W tej chwili moje rzadkie macierze są w zasadzie zaimplementowane jako zapakowane std::map< std::pair<int, int>, double>
, które przechowuje dane, jeśli takie istnieją. Przekształca to mnożenie macierzy od wektora do złożoności O (n²) do O (n²log (n)), ponieważ muszę wykonać wyszukiwanie dla każdego elementu macierzy. Zajrzałem do formatu macierzy Yale Sparse i wydaje się, że pobieranie elementu jest również w O (log (n)), więc nie jestem pewien, czy byłoby to znacznie szybsze.
Dla odniesienia mam macierz 800x800, która jest wypełniona 5000 wpisów. Zajmuje to około 450 sekund, aby rozwiązać taki system metodą gradientu sprzężonego.
Czy myślisz, że można to zrobić szybciej z inną strukturą danych?
dziękuję!
Przeczytaj najpierw wikipedię. http://en.wikipedia.org/wiki/Sparse_matrix ma dobrą listę popularnych metod przechowywania danych, które zapewnią wydajne operacje. –
@Song Wang: Celem zajęć jest przede wszystkim, aby rzucić nasza metoda elementów skończonych solver – lezebulon