Korzystam z MATLAB, aby rozwiązać problem polegający na rozwiązywaniu za każdym razem, gdy b zmienia się z czasem. Obecnie realizuję to za pomocą MATLAB-a :mldivide
x = A\b
Mam elastyczność, aby wykonać tyle wstępnych obliczeń, ile potrzeba, więc zastanawiam się, czy istnieje szybsza i / lub dokładniejsza metoda niż mldivide
. Co zazwyczaj się tutaj robi? Dziękuje wszystkim!
Odpowiedzi:
Najbardziej oczywistą rzeczą, jaką możesz zrobić, jest wstępne obliczenie
[L,U] = lu(A)
~ O (n ^ 3)Następnie po prostu oblicz
x = U \ (L \ b)
~ O (2 n ^ 2)To ogromnie obniżyłoby koszt i przyspieszyło. Dokładność byłaby taka sama.
źródło
L\b
. Ponieważ widziałem tę dokładną linię w kodzie o wysokiej wydajności przez tych, których uważam za ekspertów.[L,U,p] = lu(A,'vector'); x = U\(L\b(p));
Patrz przykład 3 wlu
dokumentacji .Przeprowadziliśmy rozległe laboratoria komputerowe na naszych naukowych kursach komputerowych na ten temat. W przypadku „małych” obliczeń, które tam przeprowadziliśmy, operator odwrotnego ukośnika Matlaba był zawsze szybszy niż cokolwiek innego, nawet po tym, jak zoptymalizowaliśmy nasz kod tak bardzo, jak to możliwe i ponownie uporządkowaliśmy wszystkie macierze (na przykład przy zamawianiu rzadkich matryc przez Reverse Cuthill McKee) .
Możesz sprawdzić jedną z naszych instrukcji laboratoryjnych . Odpowiedź na twoje pytanie znajduje się (wkrótce) na stronie 4.
Dobra książka na ten temat została napisana na przykład przez Cheneya .
źródło
inv(A)
V*b
Kilka notatek
Dla analizy stabilności i błędów zobacz komentarze do tej innej odpowiedzi , szczególnie tej autorstwa VictorLiu.
Pomiar czasu przeprowadzono za pomocą Matlaba R2011b na 12-rdzeniowym komputerze ze dość stałą średnią wartością obciążenia UNIX wynoszącą 5; najlepszy
tic, toc
czas z trzech sond.źródło
inv(A)
A\B
Spójrz na to pytanie , odpowiedzi pokazują, że
mldivide
jest dość sprytny, a także daje sugestie, jak zobaczyć, co Matlab używa do rozwiązaniaA\b
. Może to dać podpowiedź dotyczącą opcji optymalizacji.źródło
Użycie odwrotnego ukośnika jest mniej więcej równoważne
inv(A)*B
, jeśli swobodnie go kodujesz, ten drugi może być bardziej intuicyjny. Są mniej więcej takie same (po prostu różnią się sposobem przeprowadzania obliczeń), chociaż powinieneś sprawdzić dokumentację Matlaba w celu uzyskania wyjaśnień.Aby odpowiedzieć na twoje pytanie, odwrotny ukośnik jest ogólnie w porządku, ale zależy to od właściwości macierzy masy.
źródło
inv(A)
skoro to samo jest droższe niżA\b
?