<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Matrix-Kettenmultiplikation</id>
	<title>Matrix-Kettenmultiplikation - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Matrix-Kettenmultiplikation"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Matrix-Kettenmultiplikation&amp;action=history"/>
	<updated>2026-06-05T04:30:42Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Matrix-Kettenmultiplikation&amp;diff=1406414&amp;oldid=prev</id>
		<title>imported&gt;Crazy1880: dafür kein HTML (ID 11)</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Matrix-Kettenmultiplikation&amp;diff=1406414&amp;oldid=prev"/>
		<updated>2019-04-02T06:55:32Z</updated>

		<summary type="html">&lt;p&gt;dafür kein HTML (ID 11)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;&amp;#039;Matrix-Kettenmultiplikation&amp;#039;&amp;#039;&amp;#039; bezeichnet die [[Matrizenmultiplikation|Multiplikation]] von mehreren [[Matrix (Mathematik)|Matrizen]]. Da die Matrizenmultiplikation [[Assoziativgesetz|assoziativ]] ist, kann man dabei beliebig klammern. Dadurch wächst die Anzahl der möglichen Berechnungswege überpolynomial mit der Länge der Matrizenkette an. Mit der Methode der [[Dynamische Programmierung|dynamischen Programmierung]] kann die Klammerung der Matrix-Kette optimiert werden, so dass die Gesamtanzahl arithmetischer Operationen minimiert wird. Der Algorithmus hat eine Laufzeit von [[Landau-Symbole|&amp;lt;math&amp;gt;O&amp;lt;/math&amp;gt;]]&amp;lt;math&amp;gt;(n^3)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der möglichen Klammerungen für &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; Matrizen lässt sich mit der [[Catalan-Zahl]] C&amp;lt;sub&amp;gt;n-1&amp;lt;/sub&amp;gt; bestimmen.&lt;br /&gt;
&lt;br /&gt;
Beispiel: Sei &amp;lt;math&amp;gt;A&amp;lt;/math&amp;gt; eine 10×30 Matrix, &amp;lt;math&amp;gt;B&amp;lt;/math&amp;gt; eine 30×5 Matrix und &amp;lt;math&amp;gt;C&amp;lt;/math&amp;gt; eine 5×60 Matrix. Dann gibt es zwei verschiedene Arten, das Matrizenprodukt &amp;lt;math&amp;gt;ABC&amp;lt;/math&amp;gt; zu klammern:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;(AB)C&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;A(BC)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Anzahl der grundlegenden Operationen berechnet sich wie folgt:&lt;br /&gt;
&lt;br /&gt;
:&amp;lt;math&amp;gt;(AB)C \rightarrow (10\cdot 30\cdot 5) + (10\cdot 5\cdot 60)  = 1500 + 3000 = 4500&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;A(BC) \rightarrow (30\cdot 5\cdot 60) + (10\cdot 30\cdot 60) = 9000 + 18000 = 27000&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
Der Algorithmus berechnet mittels dynamischer Programmierung eine Ergebnis-Matrix. Bei einer Kette &amp;lt;math&amp;gt;A_0A_1A_2\ldots A_{n-1}&amp;lt;/math&amp;gt; von &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; Matrizen ist die Eingabe des Algorithmus die Sequenz &amp;lt;math&amp;gt;s&amp;lt;/math&amp;gt; der Dimensionspaare &amp;lt;math&amp;gt;s = [ ( \mathit{firstdim}(A_i), \mathit{seconddim}(A_i) ) | 0 \le i &amp;lt; n]&amp;lt;/math&amp;gt;, wobei die Funktion firstdim bzw. seconddim angewendet auf eine &amp;lt;math&amp;gt;m\times n&amp;lt;/math&amp;gt;-Matrix &amp;lt;math&amp;gt;m&amp;lt;/math&amp;gt; bzw. &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; zurückgibt.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s[0..2]&amp;lt;/math&amp;gt; bezeichnet die Teilsequenz von s, die die ersten beiden Dimensionspaare enthält. Also ist &amp;lt;math&amp;gt;s[0..\mathit{length}(s)] = s&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Der Algorithmus wird durch eine Matrix-Rekurrenz spezifiziert.&lt;br /&gt;
&lt;br /&gt;
;Initialisierung&lt;br /&gt;
&amp;lt;math&amp;gt;M[i,i+2] = \mathit{firstdim}(i)\cdot \mathit{seconddim}(i+1)\cdot \mathit{firstdim}(i+1),~0\le i&amp;lt;\mathit{length}(s)-1&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Für alle zwei Matrizen lange Ketten gibt es nur eine Möglichkeit der Klammerung.&lt;br /&gt;
&lt;br /&gt;
;Rekursion&lt;br /&gt;
&amp;lt;math&amp;gt;M[i,j]=\min_{i&amp;lt;k&amp;lt;j} \big\{ M[i,k] + M[k+1,j] + \mathit{firstdim}(i)\cdot \mathit{seconddim}(j-1)\cdot \mathit{firstdim}(k) \big\}&amp;lt;/math&amp;gt;,&lt;br /&gt;
&lt;br /&gt;
wobei &amp;lt;math&amp;gt;i+2&amp;lt;j, 0\le i\le \mathit{length}(s), 0\le j\le \mathit{length}(s)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
In der Zelle &amp;lt;math&amp;gt;M[i,j]&amp;lt;/math&amp;gt; steht die minimale Anzahl von grundlegenden arithmetischen Operationen, um die Teilsequenz &amp;lt;math&amp;gt;s[i..j]&amp;lt;/math&amp;gt; der Matrizenkette zu multiplizieren. Also ist die minimale Anzahl der Operationen bei der Multiplikation der gesamten Kette in der Zelle &amp;lt;math&amp;gt;M[0, \mathit{length}(s)]&amp;lt;/math&amp;gt; gespeichert.&lt;br /&gt;
&lt;br /&gt;
Um die optimale Klammerung zu konstruieren, die zu dem optimalen Ergebnis in &amp;lt;math&amp;gt;M[0, \mathit{length}(s)]&amp;lt;/math&amp;gt; geführt hat, muss der Pfad in der DP-Matrix &amp;lt;math&amp;gt;M&amp;lt;/math&amp;gt; mittels [[Backtracking]] von &amp;lt;math&amp;gt;M[0, \mathit{length}(s)]&amp;lt;/math&amp;gt; aus zurückverfolgt werden.&lt;br /&gt;
&lt;br /&gt;
== Effizienz ==&lt;br /&gt;
Die Länge der Eingabesequenz wird mit &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; bezeichnet. Der Algorithmus benötigt zum Speichern der Zwischenergebnisse für alle Teilsequenzen eine quadratische &amp;lt;math&amp;gt;n\times n&amp;lt;/math&amp;gt;-Matrix. Also liegt der Speicherbedarf in &amp;lt;math&amp;gt;O(n^2)&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Für jede Zelle muss über &amp;lt;math&amp;gt;O(n)&amp;lt;/math&amp;gt; Aufteilungen optimiert werden. Also ist die Gesamtlaufzeit in &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Varianten ==&lt;br /&gt;
Der Optimierungsalgorithmus ist für beliebige Sequenzen von Objekten verwendbar, welche durch eine assoziative Operation verkettet sind, wenn eine Kostenfunktion für die Ausführung der Operation existiert.&lt;br /&gt;
&lt;br /&gt;
Durch eine einfache Modifikation der Rekurrenz kann die Anzahl der Klammerungen in &amp;lt;math&amp;gt;O(n^3)&amp;lt;/math&amp;gt; berechnet werden.&lt;br /&gt;
&lt;br /&gt;
== Abgrenzung ==&lt;br /&gt;
Cormen, 2001 (S. 369), verweist auf einen Algorithmus von Hu und Shing&amp;lt;ref&amp;gt;[http://i.stanford.edu/pub/cstr/reports/cs/tr/81/875/CS-TR-81-875.pdf Hu Shing, Computation of Matrix Chain Products, Part I, Part II. 1980, Report.]&amp;lt;/ref&amp;gt; zur Optimierung der Klammerung bei der Matrix-Kettenmultiplikation, der eine Laufzeit von &amp;lt;math&amp;gt;O(n\log n)&amp;lt;/math&amp;gt; hat.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* {{BibISBN|0262032937|Seite=331–338}}&lt;br /&gt;
* {{Literatur |Autor=T. C. Hu, M. T. Shing |Titel=Computation of Matrix Chain Products. Part I |Sammelwerk=SIAM Journal on Computing |Band=11 |Nummer=2 |Datum=1982 |Seiten=362–373 |DOI=10.1137/0211028}}&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Dynamische Programmierung]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Crazy1880</name></author>
	</entry>
</feed>