Bez pewnych informacji na temat budowy tych pozytywnych określonych rzeczywistych macierzy symetrycznych, sugestie, które należy poczynić, są z konieczności dość ograniczone.12 × 12
Pobrałem pakiet Armadillo z Sourceforge i przejrzałem dokumentację. Postaraj się poprawić wydajność osobnego obliczania i , gdzie jest macierzą pierwszego rzędu wszystkich, ustawiając np . Dokumentacja zauważa, że jest to ustawienie domyślne dla macierzy do rozmiaru , więc przez pominięcie zakładam, że opcja jest domyślna dladet ( 12 Idet ( Q )J 4 × 4 12 × 12det ( 12 I- Q - J)jotdet(Q,slow=false)
4 × 4slow=true
12 × 12 .
To, co slow=true
przypuszczalnie działa, to częściowe lub pełne obrócenie w celu uzyskania formy rzutu rzędowego, z której łatwo można znaleźć wyznacznik. Jakkolwiek wiesz z góry, macierz jest pozytywnie określona, więc obrót nie jest konieczny dla stabilności (przynajmniej przypuszczalnie dla większości twoich obliczeń. Nie jest jasne, czy pakiet Armadillo rzuca wyjątek, jeśli osie stają się zbyt małe, ale powinno to być cecha rozsądnego numerycznego pakietu algebry liniowej EDYCJA: Znalazłem kod Armadillo, który implementuje się w pliku nagłówkowym , używając szablonów C ++ dla znacznej funkcjonalności.12 × 12Qdet
include\armadillo_bits\auxlib_meat.hpp
slow=false
nie wpływa na to, jak12 × 12wyznacznik zostanie wykonany, ponieważ obliczenia zostaną „przerzucone przez ścianę” do LAPACK (lub ATLAS) w tym punkcie bez wskazania, że obrót nie jest wymagany; widziećdet_lapack
i jego wywołania w tym pliku.
Inną kwestią byłoby zastosowanie się do ich zalecenia budowy pakietu Armadillo łączącego szybkie zamienniki BLAS i LAPACK, jeśli rzeczywiście ich używasz; patrz ust. 5 pliku README.TXT Armadillo, aby uzyskać szczegółowe informacje. [Użycie dedykowanej 64-bitowej wersji BLAS lub LAPACK jest również zalecane ze względu na szybkość na obecnych komputerach 64-bitowych.]
Redukcja wiersza do postaci ekhelona jest zasadniczo eliminacją Gaussa i ma złożoność arytmetyczną . W przypadku obu macierzy stanowi to dwukrotność tej pracy lub . Operacje te mogą być „wąskim gardłem” w przetwarzaniu, ale nie ma nadziei, że bez specjalnej struktury w (lub niektórych znanych zależności między trylionami przypadków testowych umożliwiających amortyzację) praca mogłaby zostać zredukowana do42)3)n3)+ O ( n2))Q O ( n 2 )43)n3)+ O ( n2))QO ( n2)) .
Dla porównania, ekspansja przez kofaktory ogólnej macierzy obejmujeoperacje mnożenia (i mniej więcej tyle samo dodawania / odejmowania), więc dla porównanie ( vs. ) wyraźnie sprzyja eliminacji nad kofaktorami.n ! n = 12 12 ! = 479001600 2n × nn !n = 1212 ! = 4790016002)3)n3)= 1152
Innym podejściem wymagającym pracy byłoby sprowadzenie do postaci tridiagonalnej za pomocą transformacji Householdera, co również nadaje formie tridiagonal. Obliczenia i można następnie wykonać w operacjach . [Wpływ aktualizacji rangi 1 na drugą determinantę można wyrazić jako czynnik skalarny podany przez rozwiązanie jednego układu trójosiowego.]Q12I-Qdet(Q)det(12I43)n3)+ O ( n2))Q12I−Qdet(Q)O ( n ) - Jdet(12I−Q−J)O(n)−J
Wdrożenie takiego niezależnego obliczenia może być przydatne jako sprawdzenie wyników udanych (lub nieudanych) wywołań det
funkcji Armadillo .
Przypadek specjalny: jak sugeruje Komentarz Jernej, załóżmy, że gdzie jak poprzednio, jest macierzą (rangi 1) wszystkich, a jest macierz niepołączona (dodatnia). Rzeczywiście dla proponowanego zastosowania w teorii grafów byłyby to macierze całkowite. Następnie wyraźna formuła dlaJ DQ=D−JJdet ( Q )D=diag(d1,…,dn)det(Q) to:
det(Q)=(∏i=1ndi)(1−∑i=1nd−1i)
Szkic dowodu daje możliwość zilustrowania szerszego zastosowania, tj. Ilekroć ma znaną determinantę, a układ jest szybko rozwiązywany. Zacznij od faktorowania:D v = ( 1 … 1 ) TDDv=(1…1)T
det(D−J)=det(D)⋅det(I−D−1J)
Teraz znów zajmuje 1 pozycję, a mianowicie( d - 1 1 …D−1J(d−11…d−1n)T(1…1) . Zauważ, że drugą determinantą jest po prostu:
f(1)=det(I−D−1J)
gdzie jest charakterystyczny wielomianem . Jako macierz rangi 1, musi mieć (co najmniej) czynniki aby uwzględnić jej pustą przestrzeń. „Brakująca” wartość własna to , jak można zobaczyć na podstawie obliczeń:D - 1 J f ( x ) n - 1f(x)D−1Jf(x)n−1∑ d - 1 ix∑d−1i
D−1J(d−11…d−1n)T=(∑d−1i)(d−11…d−1n)T
Wynika z tego, że charakterystyczny wielomian , a jest taki jak pokazano powyżej dla , .f ( 1 ) det ( I - D - 1 J ) 1 - ∑ d - 1 if(x)=xn−1(x−∑d−1i)f(1)det(I−D−1J)1−∑d−1i
Zauważ też, że jeśli , to , macierz diagonalna, której wyznacznikiem jest po prostu iloczyn jej wpisów diagonalnych.12 I -Q=D−J12I−Q−J=12I−D+J−J=12I−D