Czy ktoś wie, jakiego algorytmu używa MATLAB do multiplikacji macierzy i jaka jest złożoność czasu?Złożoność czasu mnożenia macierzy w MATLAB
Odpowiedz
Dla kompletności - jak wspomniano w this thread, Matlab używa DGEMM
(Dwuosobowy Ogólne Matrix Mnożenie) rutynowe z BLAS (podstawowy algebra liniowa podprogramu).
Należy zauważyć, że nie ma jednej implementacji BLAS - jest dostrojony do konkretnych architektur procesorów. Dlatego nie można mieć absolutnej pewności, który algorytm jest używany na komputerze, bez sprawdzania, która wersja BLAS jest w użyciu.
Specyfikacja BLAS określa wejścia i wyjścia każdego podprogramu i zapewnia akceptowalne granice błędów dla wyjścia każdej podprogramu. Implementacje mogą dowolnie używać dowolnego algorytmu, pod warunkiem, że będą zgodne ze specyfikacją.
przykład implementacja BLAS wykorzystuje block matrix multiplication algorithm w DGEMM
który ma czas złożoność O (n^3) do mnożenia dwóch n x n macierzy. Sądzę, że rozsądne jest założenie, że większość wdrożeń BLAS będzie mniej więcej zgodna z implementacją referencyjną.
Zauważ, że nie korzysta z naiwnego algorytmu mnożenia macierzy
for i = 1:N
for j = 1:N
for k = 1:N
c(i,j) = c(i,j) + a(i,k) * b(k,j);
end
end
end
To dlatego, że zwykle, cała matryca nie zmieści się w local memory. Jeśli dane są ciągle przenoszone do pamięci lokalnej i z niej, algorytm zwalnia. Algorytm macierzy bloków dzieli operację na małe bloki, tak że każdy blok jest wystarczająco mały, aby zmieścił się w lokalnej pamięci, zmniejszając liczbę przesunięć do i z pamięci.
Istnieją asymptotycznie szybsze algorytm mnożenia macierzy, np Strassen algorithm lub Coppersmith-Winograd algorithm które mają nieco szybciej niż o (n^3). Jednak generalnie nie są one chronione pamięcią podręczną i ignorują lokalizację - co oznacza, że dane muszą być nieustannie przemieszczane w pamięci, tak więc w przypadku większości nowoczesnych architektur ogólny algorytm jest w rzeczywistości wolniejszy niż zoptymalizowany algorytm mnożenia macierzy blokowej.
Wikipedia zauważa, że algorytm Strassena może zapewniać przyspieszenia na pojedynczym rdzeniu procesora w przypadku macierzy o rozmiarach większych niż kilka tysięcy, jednak przyspieszenie może wynosić około 10% lub mniej, a twórcy BLAS prawdopodobnie nie uważają tego Warto w tym rzadkim przypadku (mówiąc, że this paper z 1996 r. twierdzi, że wzrost prędkości o około 10% w stosunku do DGEMM
dla n powyżej około 200 - choć nie wiem, jak nieaktualny). Z kolei algorytm Coppersmith-Winograd "zapewnia przewagę tylko dla macierzy tak dużych, że nie mogą być przetwarzane przez nowoczesny sprzęt".
Więc odpowiedź brzmi, że Matlab używa naiwnego, ale wydajnego algorytmu świadomego pamięci podręcznej, aby uzyskać szybką, szybką mnożenie macierzy.
Zaktualizowałem tę odpowiedź, tworząc kilka filmów, które demonstrują lokalizację algorytmu mnożenia macierzy blokowej, w porównaniu do algorytmu naiwnego.
W każdym z tych filmów, jesteśmy wizualizacji mnożenia dwóch macierzy 8x8 i B utworzyć produkt C = x B. Żółty kolor wskazuje, który element w każdej z macierzy jest przetwarzany na każdym etapie algorytmu. Możesz zobaczyć, w jaki sposób mnożenie macierzy bloków działa tylko na małych blokach macierzy naraz i ponownie wielokrotnie korzysta z każdego z tych bloków, aby zminimalizować liczbę przypadków, w których dane muszą być przenoszone i usuwane z pamięci lokalnej. .
Dobra odpowiedź +1. Zmieniłem twoje sformułowanie "mniej operacji niż O (n^3)", ponieważ ściśle rzecz biorąc, dwie procedury mogą być O (n^3), ale jedna może mieć mniej operacji niż druga. –
Dzięki @ColinTBowers –
- 1. Algorytm mnożenia macierzy Boole'a
- 2. mnożenie macierzy kształtów mnożenia
- 3. MySQL mnożenia macierzy
- 4. Szybkie LAPACK/BLAS dla mnożenia macierzy
- 5. Problemy z szybkością mnożenia macierzy
- 6. Błąd przy użyciu prostego mnożenia macierzy
- 7. Optymalizowanie kodowania mnożenia macierzy batched macierzy
- 8. Czym jest złożoność dodawania macierzy?
- 9. Złożoność czasu system.out.println
- 10. Złożoność czasu zabawy()?
- 11. Efektywne mnożenie bardzo dużych macierzy w MATLAB
- 12. Jak zmierzyć gflops jądra mnożenia macierzy?
- 13. Funkcje macierzy Matlab w java
- 14. Porównanie wielu macierzy matlab
- 15. Złożoność czasu dla java ArrayList
- 16. Jaka jest złożoność czasowa inicjowania macierzy?
- 17. Wydajna metoda wyszukiwania elementów w macierzy MATLAB
- 18. Jaka jest złożoność czasu HashMap.containsKey() w java?
- 19. Jaka jest złożoność czasu HashMap.containsValue() w java?
- 20. Przypisanie wektor wierszowi macierzy MATLAB
- 21. Kilka liczników czasu w MATLAB
- 22. Prealokacja macierzy komórek w programie matlab
- 23. Łączenie macierzy wartości i indeksów w MATLAB
- 24. wektory konkatenacji macierzy komórkowej w matlab
- 25. det macierzy zwraca 0 w matlab
- 26. Obliczanie macierzy kowariancji w programie Matlab
- 27. druk n * m macierzy w Matlab
- 28. Indeksowanie macierzy 2D w programie Matlab
- 29. jak obliczyć złożoność czasu sortowania bąbelkowego
- 30. Jaka jest złożoność czasu przeglądarek HTML DOM
To pytanie odpowiedział na Matlab Środkowej w 2009 roku [tutaj] (http://www.mathworks.com.au/matlabcentral/newsreader/view_thread/242624) (Dokładniej zobacz drugą odpowiedź od Tima Davisa). Nie jestem pewien, czy od tego czasu coś się zmieniło ... –