Matrix-Exponential-Operator - Rosetta-Code
C nicht Klassen unterstützen oder Betreiber Überlastung ermöglichen. Das Folgende ist Code, der eine Funktion definiert, die eine Matrix SquareMtxPower auf eine positive ganzzahlige Potenz erhöhen wird.
Dies ist eine Implementierung in C ++.
Dies ist die Aufgabe Teil.
Eine alternative Möglichkeit wäre es, wie auch operator * = und die Umwandlung von der Nummer (was ein Vielfach der Einheitsmatrix) für die Matrix und verwendet, um den generischen Code aus Potenzierungsoperator # C ++ mit Unterstützung für negative Exponenten entfernt (oder alternativ implementieren Matrixinversion zu implementieren , implementieren / = in Bezug auf sie, und verwenden sie den generischen Code unverändert). Beachten Sie, dass der Algorithmus verwendet es viel schneller als gut.
Diese Common Lisp-Implementierung verwendet 2D-Arrays Matrizen darzustellen, und überprüft, um sicherzustellen, dass der Arrays die richtigen Abmessungen für die Multiplikation und Platz für Potenzierung sind.
Dies verwendet die '*' Operator für Arrays wie in Matrix_multiplication # Chapel definiert
Anwendungsbeispiel (wie Perl):
Maple Griffe Matrix Kräfte implizit mit dem eingebauten in Potenzierungsoperator:
Wenn Sie element Kräfte wollen, können Sie das element verwenden ^
In Mathematica gibt es eine Unterscheidung Elemente weisen und als Matrix zwischen antreibt. So m ^ 2 geben m mit jedem Element im Quadrat. Tun Matrix exponentation wir die Funktion MatrixPower verwenden. Es kann alle Arten von Zahlen für die Leistung (ganze Zahlen, Schwimmern, rationals, komplex) handhaben, sondern auch Symbole für die Macht, und alle Arten für die Matrix (Zahlen, Symbole usw.), und wird immer das Ergebnis genau, wenn die Matrix und der Exponent ist exakt.
Symbolische Matrizen wie,> an die Strom m geben allgemeine Lösungen für alle möglichen i, j, k, l und m:
gibt zurück (man beachte, dass die Vereinfachung für die Auswertung nicht erforderlich ist, gibt es nur eine kürzere Ausgabe):
(2 # X2212; m # X2212; 1 ((i 2 # X2212; 2 l i + 4 j k + l 2 # X2212; i + L) ( # X2212; i 2 # X2212; 2 i l + 4 l + j k 2 + i + L) m + (i & sub2; # X2212; 2 i l + 4 l + j k 2 + i # X2212; l) (i 2 # X2212; 2 i l + 4 l + j k 2 + i + l) m) i 2 # X2212; 2 i l + 4 l + k j 2 j 2 # X2212; m ((i 2 # X2212; 2 i l + 4 l + j k 2 + i + L) m # X2212; ( # X2212; i 2 # X2212; 2 i l + 4 l + j k 2 + i + l) m) i 2 # X2212; 2 i l + 4 l + j k 2 k 2 # X2212; m ((i 2 # X2212; 2 i l + 4 l + j k 2 + i + L) m # X2212; ( # X2212; i 2 # X2212; 2 i l + 4 l + j k 2 + i + l) m) i 2 # X2212; 2 i l + 4 l + j k 2 2 # X2212; m # X2212; 1 ((i 2 # X2212; 2 i l + 4 l + j k 2 + i # X2212; l) ( # X2212; i 2 # X2212; 2 i l + 4 l + j k 2 + i + L) m + (i & sub2; # X2212; 2 l i + 4 j k + l 2 # X2212; i + L) (i 2 # X2212; 2 i l + 4 l + j k 2 + i + l) m) i 2 # X2212; 2 il + 4 jk + l 2) \ links (\ links (-2il + 4jk + l ^ >> - i + l \ rechts) \ links (- 2il + 4jk + l ^ + i >> l \ rechts + ) ^ + \ links (-2il + 4jk + l ^ il >> + \ rechts) \ links (-2il + 4jk + l ^ + i >> l \ rechts) ^ \ right) +> - 2il + 4jk + l ^ >>> - \ left (\ left (-2il + 4jk + l ^ >> + i l \ right) + ^ - \ left (- 2il + 4jk + l ^ >> + i l \ right) + ^ \ right)> - 2il + 4jk + l ^ >>> \\\ links (\ left (-2il + 4jk + l ^ >> + i l \ right +) ^ - \ left (- 2il + 4jk + l ^ >> + i + l \ right) ^ \ right)> - 2il + 4jk + l ^ >>> - \ left (\ left (-2il + 4jk + l ^ >> + il \ right) \ left (- -2il + 4jk + l ^ + i >> l \ rechts) + ^ + \ links (-2il + 4jk + l ^ >> - i + l \ rechts) \ links (-2il + 4jk + l + ^ >> i + l \ rechts) ^ \ right)> - 2il + 4jk + l ^ >>> \ end> \ rechts)>
Abschließender Hinweis: Verwechseln Sie nicht MatrixPower mit MatrixExp; die erstere ist für die Matrix Potenzierung und letztere für die Matrix exponentiellen (E ^ m).
Für Exponenten in Form von A * A * A * A *. * A, A ist eine quadratische Matrix sein:
Ansonsten nehmen die einzelnen Array-Elemente an die Leistung eines Exponenten (die Matrix muß nicht quadratisch sein):
Wir werden einige Hilfsfunktionen verwenden
Jetzt Matrizenpotenzen ist einfach ein Spezialfall von pow:
(Natürlich ist dies nicht eine Implementierung, aber es kann für die Ergebnisse als Referenz verwendet werden)
Rubys Standardbibliothek bietet bereits den Matrix-Exponential-Operator. Es ist Matrix # ** aus dem Paket ‚Matrix‘ der Standardbibliothek. MRI 1.9.x implementiert die Matrix-Exponential-Operator in der Datei matrix.rb. def ** (um die Linie 961).
Beginnend mit Ruby-1.9.3, kann es auch Matrix berechnen ** Float.
Arbeitet mit. Ruby-Version 1.9.3
Bei älteren Rubin, wirft es eine Ausnahme für Matrix ** Float.
Der Einfachheit halber wird die Matrix als eine Liste von Listen dargestellt und keine Dimension Prüfung stattfindet. Diese Implementierung funktioniert nicht, wenn der Exponent 0 ist.
Das folgende Beispiel verwendet mehrere Merkmale von Seed7:
- Eine Überlastung der Operatoren * und **.
- Die Vorlage enable_output. die es ermöglicht eine Matrix mit write (die Funktion str müssen vor dem Aufruf enable_output definiert werden).
- Eine Schleife, die für Werte Schleifen über die in einem Array aufgelistet literal
Ursprüngliche Quelle der Matrix Potenzierung: [1]