Gibt es eine schnellere Methode der Matrixexponentiation zur Berechnung von M^n (wobei M eine Matrix und n eine ganze Zahl ist) als der einfache Divide and Conquer-Algorithmus.Schnelle Matrixexponentiation
Antwort
Sie könnten die Matrix in Eigenwerte und Eigenvektoren einteilen. Dann erhalten Sie
M = V^-1 * D * V
Wo V ist die Eigenvektormatrix und D ist eine diagonale Matrix. Um dies zu der N-ten potenzieren, erhalten Sie so etwas wie:
M^n = (V^-1 * D * V) * (V^-1 * D * V) * ... * (V^-1 * D * V)
= V^-1 * D^n * V
Da alle V und V^-1 Bedingungen kündigen.
Da D diagonal ist, müssen Sie nur eine Reihe von (echten) Zahlen auf die n-te Potenz erhöhen, anstatt auf volle Matrizen. Sie können das in logarithmischer Zeit in n tun.
Berechnung von Eigenwerten und Eigenvektoren ist r^3 (wobei r die Anzahl der Zeilen/Spalten von M ist). Abhängig von den relativen Größen von r und n könnte dies schneller sein oder nicht.
Soweit ich weiß, hat diese Methode die gleiche Komplexität wie die Potenzierung durch Quadrieren. Gibt es eine schnellere Methode? –
@AkashdeepSaluja: Dies ist schneller als die Potenzierung durch Quadrieren. Dies ist O (r^3) Zeit, die Potenzierung durch Quadrieren ist O (r^3 logn) Zeit. –
für eine bessere Erklärung der oben genannten Methode http://www.google.co.in/url?sa=t&rct=j&q=pdf%20nth%20power%20of%20matrix&source=web&cd=1&cad=rja&ved=0CCAQFjAA&url=http% 3A% 2F% 2Fwww.qc.edu.hk% 2Fmath% 2FTeaching_Learning% 2FNth% 2520power% 2520von% 2520a% 2520square% 2520matrix.pdf & ei = Jf9JULrwFsi8rAejh4C4DQ & usg = AFQjCNE7yqQce5jdtyyVLFpSZmYUnoWyVA –
Exponentiation by squaring wird häufig verwendet, um hohe Leistungen von Matrizen zu erhalten.
Ich würde Ansatz zur Berechnung der Fibbonacci-Sequenz in matrix form empfehlen empfehlen. AFAIK ist seine Effizienz O (log (n)).
Sie müssen das mit den Kosten multiplizierender Matrizen multiplizieren.Die Gesamtlaufzeit ist O (n^3 log n). – saadtaame
Es ist ziemlich einfach, Euler schnellen Leistungsalgorithmus zu verwenden. Verwenden Sie den nächsten Algorithmus.
#define SIZE 10
//It's simple E matrix
// 1 0 ... 0
// 0 1 ... 0
// ....
// 0 0 ... 1
void one(long a[SIZE][SIZE])
{
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
a[i][j] = (i == j);
}
//Multiply matrix a to matrix b and print result into a
void mul(long a[SIZE][SIZE], long b[SIZE][SIZE])
{
long res[SIZE][SIZE] = {{0}};
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
for (int k = 0; k < SIZE; k++)
{
res[i][j] += a[i][k] * b[k][j];
}
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++)
a[i][j] = res[i][j];
}
//Caluclate a^n and print result into matrix res
void pow(long a[SIZE][SIZE], long n, long res[SIZE][SIZE])
{
one(res);
while (n > 0) {
if (n % 2 == 0)
{
mul(a, a);
n /= 2;
}
else {
mul(res, a);
n--;
}
}
}
Nachstehend finden Sie für Zahlen Äquivalent finden:
long power(long num, long pow)
{
if (pow == 0) return 1;
if (pow % 2 == 0)
return power(num*num, pow/2);
else
return power(num, pow - 1) * num;
}
- 1. Schnelle Zeichenerkennung
- 2. Schnelle Animationsabfrage
- 3. schnelle Quadratwurzeloptimierung?
- 4. Schnelle Datumsformatierung
- 5. Schnelle Dateiübertragung
- 6. KVC vs schnelle Aufzählung
- 7. C# schnelle Hash-Berechnung
- 8. Schnelle zweidimensionale Mustererkennung
- 9. UIView.animateWithDuration schnelle Loop-Animation
- 10. Schnelle vektorisierte datetime.combine()
- 11. GoogleAnalytics - schnelle Fehler
- 12. Android, schnelle Videoverarbeitung
- 13. Schnelle Eingabe Ausgabefunktion
- 14. Delphi schnelle Dateikopie
- 15. Schnelle, effiziente Interprozessing Messaging
- 16. Schnelle Numpy Loops
- 17. schnelle Sortierung in C++
- 18. Qt Schnelle Speichernutzung
- 19. Schnelle Vektordifferenz/Ähnlichkeitsmessungen
- 20. Schnelle Ausgabe mit TableView
- 21. Haskell schnelle Sortierkomplexität?
- 22. schnelle Weg von
- 23. Schnelle String-Array - Cython
- 24. Schnelle Deinitialisierung von Globalen
- 25. Schnelle BitArray in OCaml
- 26. Schnelle InnoDB-Wiederherstellung?
- 27. suchen schnelle Abfrage
- 28. schnelle Shell finden
- 29. Schnelle Pixelzeichnung in WPF
- 30. Schnelle automatische AWS-Skalierung
Hey ich fand einen Link in Stackoverflow es nur Besuche http://stackoverflow.com/questions/12268516/matrix-exponentiation -using-fermats-Theorem –
Expokit ist ein bekanntes Paket zur Durchführung von Matrix-Exponentiationen. http://fortranwiki.org/fortran/show/Expokit – Sayan