AW: Matritzenmultiplikation - Fehler?
12.10.2006 09:25:12
ingUR
Hallo, Jens,
um nun auch eine Antwort auf die Frage zu geben, wie man es einrichten kann, die vorzuhaltende Matrixgröße der Zufallszahlen Z(mZr, nZr) zu umgehen, muß man kurz eine Blick auf die Matrixmultiplikation werfen:
W(mCr, mZr) = C(mCr, nCr) * ZT(mZr, nZr)
mit nCr = nZr = n.
Die Elemente der Ergebnismatrix W ergeben sich aus dem Summenprodukt der Elemente einer Zeile der Matrix C und Z:
wi,k = SUMt=1,n( ci,t * zk,t )
mit i = 1, mCr und k = 1,mZr.
k-> z, z, z, .. , z
i z, z, z, .. , z
| z, z, z, .. , z
v z, z, z, .. , z
m,m,m,m w, w, w, .. , w
m,m,m,m w, w, w, .. , w
m,m,m,m w, w, w, .. , w
m,m,m,m w, w, w, .. , w
m,m,m,m w, w, w, .. , w
(m, z und w sind unterschiedliche Werte und dienen im Matrixbild nur als Positionskennung!)
Nun ist es für die Resultatsmatrix W(mCr, mZr) egal, ob
- erst die Spaltenwerte k = 1,mZr einer Zeile i ermittelt werden oder aber man
- erst die Zeilenwerte i = 1, mCr der Spalte k berechnet.
Für die Programmierung macht es hingegen doch einen Unterschied, da der transponierte Zeilenvektor zj mit seinen n Elementen, beim Ansatz nach Punkt b nur für die Dauer der Matrixmultplikation einer Spalte der Ergebnismatrix vorhanden sein muß. Für dei folge Spalte wird ein neuer Zufallsvektor gebildet.
Damit reduziert sich die Feldgröße der Zufallswerte auf genau n Elemente. Alledings kann nun nur noch mit der Worksheetfunktion SUMMENPRODUKT operiert werden, deren Argumente die Zeilenvektor der Matrix Ci und der für den Durchgang über alle Zeilen i=mCr feste Vektor der Zufallszahlen ist.
Damit entfällt die Bildung der Zufallsmatrix und der entsprechnde Programmteil der Doppelschleife.
Die Bildung des Zufallsvektor kann innerhalb der Multiplikationsdoppelscheife vor jeder neuen Resultatsspalte erfolgen (Umstellung der Schleifenfolge erorderlich!)
...
ReDim Zufall(n)
For Spalte = 0 To m - 1 'Schleife über alle Zeilen der Zufalls-Matrix
'Füllen des Zufallsvektor
For i=0 to n-1
Zufall(i) = WorksheetFunction.NormSInv(Rnd)
next i
For Zeile = 0 To m - 1 'Schleife über alle Zeilen der Choleski-Matrix
Sum = 0
For i = 0 To n - 1 'Schleife über die Summandenbildung
Sum = Sum + Choleski(Zeile, i) * Zufall(i)
Next i
'Kontrollausgabe
Cells(OUT_TOP + n + Zeile, OUT_LEFT + n + Spalte) = Sum
Next Zeile
Next Spalte
...
(das Programstück ist nicht getestet, sollte aber wie gewünscht funktionieren)
Will man nun die Worksheetfunktion für das Summenprodukt benutzen, zo hat man die beiden Vektoren (Zeile der C-Matrix und Zufallszahlen-Vektor) in den Formaten der Übergabeargumente in der Funktion aufzubauen, doch in diesem Punkt muß ich mich erst selber schlau machen.
Gruß,
Uwe
P.S.
Im übrigen könnte man auch daran Denken, ob man nicht mit Range-Objekten arbeiten kann, denen man Namensbereich des Tabellenblattes zuweist.