Testowanie, czy dwie matryce 12x12 mają tę samą determinantę


11

Dano mi macierz , która jest symetryczna, odwracalna, dodatnia określona i gęsta. Muszę sprawdzić, czy gdzie J jest macierzą wszystkich jedynek.Q det ( Q ) = det ( 12 I - Q - J )12×12QJ

det(Q)=det(12IQJ)(1)
J

Obecnie robię to z biblioteką pancernika, ale okazuje się, że jest zbyt wolny. Chodzi o to, że muszę to zrobić dla tryliona macierzy i okazuje się, że obliczenie dwóch wyznaczników jest wąskim gardłem mojego programu. Dlatego mam dwa pytania

  1. Czy jest jakiś sposób na szybsze obliczenie wyznacznika, biorąc pod uwagę jego wielkość? Czy być może niechlujne rozszerzenie dla macierzy 12×12 , które mogłoby działać w tym przypadku?

  2. Czy istnieje jakiś inny skuteczny sposób sprawdzenia równości (1)

Edytować. Aby odpowiedzieć na komentarze. Muszę obliczyć wszystkie połączone niekomplementarne wykresy G rzędu 13 tak aby G i G¯ miały tę samą liczbę drzew rozpinających. Motywację do tego można znaleźć w tym poście mathoverflow . Jeśli chodzi o maszynę, to równolegle pracuję na 8-rdzeniowej maszynie 3.4GHh.

Edytować. Udało mi się zmniejszyć oczekiwany czas działania o 50%, tworząc program C do specyficznego obliczania wyznacznika macierzy 12×12 . Sugestie są nadal mile widziane.


6
Jak wolne jest zbyt wolne? Jak długo trwa na jakim sprzęcie? Czy tryliony tych są niezależne, aby można było obliczyć wiele z tych determinant równolegle? Jeśli tak, na jakiej maszynie można uruchomić? Co doprowadziło do tego problemu? Czy na pewno musisz obliczyć wyznaczniki? Q
Bill Barth

3
Jak często (dla jakiej części przypadków) wyznaczniki są takie same / różne? Jeśli są one różne przez większość czasu, może być tańszy test, aby ustalić, że mogą się różnić, a można sprawdzić, czy są one takie same tylko w przypadku niepowodzenia pierwszego testu. Odwrotnie, jeśli są one takie same przez większość czasu.
Wolfgang Bangerth,

1
Jak już pytano: czy możesz podać szczegółowe informacje na temat tego, skąd pochodzi ? Może jest lepsze podejście niż ślepe obliczanie determinant. Q
JM

4
Pojęcie, że warunek ten należy przetestować „na trylion matryc”, sugeruje 1), że jest znane, że apriori ma jakąś specjalną strukturę (w przeciwnym razie oczekiwanie, że warunek ten jest losowy, jest niewielkie), i 2) że lepsze podejście może być charakterystyka wszystkich macierzy pomocą tej właściwości (z efektywnie sprawdzalną formułą). QQQ
hardmath

1
@hardmath Tak, jest macierzą całkowitą mającą przekątne od do i jako elementy 1 12 - 1Q1121
poziome

Odpowiedzi:


8

Ponieważ już używasz C ++, a twoje macierze są symetryczne dodatnio określone, wykonałbym niepodzielną faktoryzację dla a także dla Q 12 I - Q - J 12 I - Q - J L D L TLDLTQ12IQJ . Tutaj że jest również dodatnio określony, w przeciwnym razie będzie wymagał obrotu dla stabilności numerycznej (możliwe jest również, że nawet jeśli nie jest to wartość dodatnia, nie jest konieczne, ale musisz spróbować).12IQJLDLT

Jest to szybsze niż faktoryzacja LU, a także szybsze niż Cholesky, ponieważ unika się pierwiastków kwadratowych. Wyznacznik jest po prostu iloczynem elementów diagonalnej macierzyKod do faktoryzacji LDL jest tak prosty, że możesz napisać go w mniej niż 50 liniach C. Strona WikipediiL D L TD na to opisuje algorytm, i mam kilka prostych matrycy kod do zrobienia Cholesky tutaj . Możesz to znacznie uprościć i zmodyfikować, aby uniknąć pierwiastka kwadratowego w celu zaimplementowania faktoryzacjiLDLT

Ponieważ możesz także kontrolować format przechowywania, możesz dalej optymalizować procedurę, aby przechowywać tylko połowę macierzy i pakować ją w szyk liniowy, aby zmaksymalizować lokalizację pamięci. Napisałbym również prosty niestandardowy produkt kropkowy i procedury aktualizacji rangi 1, ponieważ rozmiary problemów są tak małe, że powinieneś pozwolić kompilatorowi na wprowadzenie procedur, aby zmniejszyć obciążenie połączeń. Ponieważ jest to pętla o stałym rozmiarze, kompilator powinien mieć możliwość automatycznego wstawiania i rozwijania elementów w razie potrzeby.

Unikałbym próbowania sztuczek, aby wykorzystać fakt, że zawiera w wyrażeniu. Jest prawdopodobne, że przy tak małych rozmiarach problemów sztuczki te są wolniejsze niż po prostu wykonywanie dwóch oddzielnych obliczeń determinant. Oczywiście jedynym sposobem na zweryfikowanie tych twierdzeń jest wypróbowanie ich.Q12IQJQ


1
Po drugie zalecam wdrożenie , czyli Cholesky wolnego od korzeni, ponieważ Armadillo nie wydaje się mieć możliwości skorzystania z pozytywnej definitywności / dominacji diagonalnej. LDLT
hardmath

5

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(12IQJ)Jdet(Q,slow=false)4×4slow=true12×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 × 12Qdetinclude\armadillo_bits\auxlib_meat.hppslow=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 do423n3+O(n2)Q O ( n 2 )43n3+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!=47900160023n3=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(12I43n3+O(n2)Q12IQdet(Q)O ( n ) - Jdet(12IQJ)O(n)J

Wdrożenie takiego niezależnego obliczenia może być przydatne jako sprawdzenie wyników udanych (lub nieudanych) wywołań detfunkcji 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=DJJdet ( Q )D=diag(d1,,dn)det(Q) to:

det(Q)=(i=1ndi)(1i=1ndi1)

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=(11)T

det(DJ)=det(D)det(ID1J)

Teraz znów zajmuje 1 pozycję, a mianowicie( d - 1 1D1J(d11dn1)T(11) . Zauważ, że drugą determinantą jest po prostu:

f(1)=det(ID1J)

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)D1Jf(x)n1d - 1 ixdi1

D1J(d11dn1)T=(di1)(d11dn1)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)=xn1(xdi1)f(1)det(ID1J)1di1

Zauważ też, że jeśli , to , macierz diagonalna, której wyznacznikiem jest po prostu iloczyn jej wpisów diagonalnych.12 I -Q=DJ12IQJ=12ID+JJ=12ID


Hm .. jest w rzeczywistości gdzie jest macierzą przylegania więc myślę, że ten wynik może być niepoprawny. W szczególności oznaczałoby to, że liczba drzew spinających na wykresie jest określona przez sekwencję stopni, która się nie utrzymuje. QDAAGG
Jernej

Pozuzakątowe wpisy będą wówczas ogólnie zawierać 0, a także -1. rozkładu sugeruje Victor wykorzystuje symetrii i zmniejsza prowadzącą określenie w liczbie operacji z do . Istnieje dokładne podejście do liczb całkowitych, ale prawdopodobnie nie jest to potrzebne w przypadku skromnej macierzy rozmiarów i wpisów. Jeśli rozumiem konstrukcję, jest pozytywnie określony z tego samego powodu, dla którego jest. QLDLT23n313n312IQJQ
hardmath

@Jernej: Jeśli uważasz, że coś, co powiedziałem, jest niepoprawne, utworzyłem pokój czatu na podstawie tego pytania, w którym dyskusję można prowadzić bez niepotrzebnego komentowania tutaj.
hardmath

1

Jeśli masz uporządkowany sposób wyliczania wykresów, które chcesz obliczyć wyznaczniki, być może znajdziesz aktualizacje niskiej rangi, które przenoszą cię z jednego wykresu na drugi.

Jeśli tak, to możesz użyć lematu wyznacznika macierzy, aby tanio obliczyć wyznacznik kolejnego wykresu, który ma być zliczony, korzystając z wiedzy o wyznaczniku bieżącego wykresu.

To znaczy, dla macierzy i wektorów : Można to uogólnić, jeśli U i V są macierzy, a jest : Au,v

det(A+uvT)=(1+vTA1u)det(A)
n×mAn×n
det(A+UVT)=det(Im+VTA1U)det(A)

Aby efektywnie obliczyć odwrotność, możesz użyć wzoru Shermana-Morrisona, aby uzyskać odwrotność kolejnej macierzy z bieżącej:

(A+uvT)1=A1A1uvTA11+vTA1u

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.