Wenn ich zwei Matrizen und B mit den Dimensionen 1000 × 2 bzw. 2 × 1000 habe und ( A B ) 5000 berechnen möchte , ist es effizienter, den Ausdruck zuerst als A ( B A ) 4999 B und nur dann umzuschreiben numerisch auswerten, da A B die Dimension 1000 × 1000 hat , B A jedoch die Dimension 2 × 2 hat .
Ich möchte eine verallgemeinerte Version dieses Problems lösen. Gibt es einen einigermaßen effizienten Algorithmus (keine Brute Force), um einen Ausdruck zu optimieren, der Folgendes enthält:
- Freie Matrixvariablen bekannter Dimensionen
- Produkte beliebiger Unterausdrücke
- Willkürliche Unterausdrücke, die zur natürlichen Macht erhoben werden
... damit die numerische Auswertung nach dem Ersetzen der freien Matrixvariablen durch konkrete Matrixwerte den geringsten Arbeitsaufwand erfordert?
Das Matrix - Kette Multiplikation Problem ist ein Spezialfall meines Problems.
Bearbeiten:
Dies ist eine vorläufige Antwort. Es scheint mir intuitiv richtig zu sein, aber ich habe keinen Beweis dafür, dass es richtig ist. Wenn es sich als richtig herausstellt, interessiert mich der Beweis immer noch. (Wenn es natürlich nicht korrekt ist, korrigieren Sie mich bitte.)
Berücksichtigen Sie für jedes Produkt, das zu einer Potenz erhoben wird, beispielsweise , jede zyklische Permutation der Faktoren:
- ...
... rekursiv. Jede Potenz ist unter Verwendung der Exponentiation durch Quadrieren (offensichtlich) zu berechnen, und alle anderen Produkte sind unter Verwendung der vom Matrixkettenmultiplikationsalgorithmus zurückgegebenen optimalen Reihenfolge zu berechnen.
Bearbeiten:
Die in meiner vorherigen Bearbeitung skizzierte Idee ist immer noch etwas nicht optimal. Die Potenzierung durch Quadrierungsalgorithmus wertet tatsächlich Ausdrücke der Form oder A n K aus , wobei K nicht unbedingt die Identitätsmatrix ist. Mein Algorithmus berücksichtigt jedoch nicht die Möglichkeit, die Exponentiation durch Quadrieren des Algorithmus mit K ungleich der Identitätsmatrix zu verwenden.