2017-06-02 61 views
7

Załóżmy, że mam kwadrat matrixM. Załóżmy, że chciałbym uzyskać invert macierz M.Szybkie odwracanie macierzy bez pakietu

Próbuję użyć klasy frakcji mpq w obrębie gmpy2 jako członków mojej macierzy M. Jeśli nie znasz tych frakcji, są one funkcjonalnie podobne do wbudowanego pakietu Pythona fractions. Jedynym problemem jest to, że nie ma pakietów, które odwrócą moją macierz, chyba że wyjmę je z frakcji. Wymagam liczb i odpowiedzi w formie ułamka. Więc będę musiał napisać własną funkcję do odwrócenia M.

Istnieją znane algorytmy, które można zaprogramować, takie jak gaussian elimination. Jednak wydajność jest problem, więc moje pytanie jest w następujący sposób:

Czy istnieje algorytmicznie szybki algorytm, który mógłbym użyć do obliczenia odwrotności macierzy M?

+1

Każdy rozsądny szybki algorytm, aby to zrobić, będzie miał możliwość implementacji w C jako rozszerzenie. Innym podejściem byłoby pomnożenie ich przez ich GCD, lub tylko na podstawie ich mianowników, w celu uzyskania liczb całkowitych i użycia pakietów z rozszerzeniami C i znacznie więcej czasu na optymalizację. To jest 'O (n)', więc jeśli algorytm do odwrócenia jest lepszy niż 'O (n)', nie zaszkodzi złożoności czasu. – Artyer

+3

Czy spojrzałeś na sympy? Działa wspaniale z GMpy2 i macierzami: http://docs.sympy.org/dev/modules/matrices/matrices.html#linear-algebra – denfromufa

+0

Tak, ale inwersja sympy jest wolniejsza niż kodowanie gaussowskie ręcznie. Mogę udostępnić mój kod do gaussowskiej eliminacji za pomocą testów porównawczych. –

Odpowiedz

4

Czy jest coś jeszcze wiesz o tych matrycach? Na przykład, dla macierzy symmetricpositive definite rozkład, Cholesky pozwala na odwrócenie szybciej niż standardowa metoda Gaussa-Jordana, o której wspomniałeś.

W celu ogólnego odwrócenia matrycy, Strassen algorithm da Ci szybszy wynik niż Gauss-Jordan, ale wolniejszy niż Cholesky.

Wygląda na to, że chcesz uzyskać dokładne wyniki, ale jeśli masz problemy z przybliżonymi inwersjami, istnieją algorytmy, które przybliżają odwrotność znacznie szybciej niż wspomniane wcześniej algorytmy.

Można jednak zadać sobie pytanie, czy potrzebna jest cała matryca odwrotna do określonej aplikacji. W zależności od tego, co robisz, może być szybsze korzystanie z innej właściwości macierzy. W moim doświadczeniu obliczanie odwrotności macierzy jest niepotrzebnym krokiem.

Mam nadzieję, że to pomoże!