Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
808to812
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
808to812
808to812
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

Matritzenmultiplikation - Fehler?

Matritzenmultiplikation - Fehler?
11.10.2006 11:19:23
Jens
Hallo,
ich möchte zwei Matritzen multiplizieren, wobei eine Matrix (Choleski) schon feststeht und die andere anhand von Zufallszahlen erzeugt werden soll.
Kann mir jemand sagen, was ich falsch gemacht habe?
Vielen Dank, Jens!

Sub wuerfeln()
Dim Zeile As Integer
Dim Spalte As Integer
Dim n As Integer
Dim Zufall() As Double
Choleski = Range(Cells(45, 18), Cells(56, 20))
Zeile = 0
Spalte = 0
Worksheets("Monte-Carlo").Activate
n = Cells(52, 3)
For Zeile = 0 To n
For Spalte = 0 To 11
Zufall(Zeile + 1, Spalte + 1) = WorksheetFunction.NormSInv(Rnd)
'= Excel-Funktion Standnorminv(Zufallszahl())
Next Spalte
Next Zeile
Worksheets("Monte-Carlo").Activate
For Zeile = 64 To n
For Spalte = 1 To 12
Cells(Zeile + 1, Spalte + 1) = WorksheetFunction.Transpose(WorksheetFunction.MMult(Choleski, WorksheetFunction.Transpose(Zufall())))
'Excel-Formel =INDEX(MTRANS(MMULT(choleski;MTRANS(Zufall!$A1:Zufall!$L1)));1;SPALTE(B65)-1
Next Spalte
Next Zeile
End Sub

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Matritzenmultiplikation - Fehler?
11.10.2006 16:50:46
ingUR
Hallo, Jens,
kann es sein, dass Deine beiden Matrix-Felder nicht zusammenpassen oder welcher Fehler tritt auf?
A1(m x n) * A2T( n x r)
m = Anzahl der Zeilen in A1
n = Anzahl der Spalten in A1
r=Anzahl der Spalten in der A2T
Ergebnis:
E( m x r )
Gruß,
Uwe
AW: Matritzenmultiplikation - Fehler?
11.10.2006 17:07:25
Jens
Hallo Uwe,
das müsste eigentlich übereinstimmen.
Aber vielleicht hast Du ja noch eine andere Idee der Programmierung. Ich möchte bspw. 12*5000 Zufallszahlen erzeugen und diese in eine Matrixmultiplikation einbinden. (Die eine Matrix ist bereits vorhanden, die andere wird aus Zufallszahlen erzeugt).
Nun nimmt es eine Menge Speicherplatz in Anspruch, so dass diese Zufallszahlen nicht physisch in ein Tabellenblatt geschrieben werden sollen, sondern gleich verarbeitet (sprich mit der vorhanden Matrix multipliziert) werden sollen. Ausgegeben werden soll dann nur noch das Ergebnis.
Hast Du da eine Idee?
Gruss, Jens
Anzeige
AW: Matritzenmultiplikation - Fehler?
11.10.2006 19:57:25
ingUR
Hallo, Jens,
weiterhin bleibt mir unklar, was Du als vermeintlichen(?) Fehler ansiehst bzw. wie dieser sich nach Deiner Einschätzung auswirkt.
Da mich das Thema MC auch als nächste Aufgabe interessiert, werde ich mal Deinen Programmcode versuchen in einer Arbeitsmappe einbinden (vielleicht kannst Du aber auch eine "Rohling" Deiner Fassung hochladen); so erkenne ich dann möglicherweise, was zu verändern ist - werde mich dann nochmals melden.
Um jedoch Alternativmöglichkeiten zur Matrixmultiplikation für Deine Anwendung zu prüfen, wäre es gut zu wissen, welche Ansätze Du verwendest (Literatur oder Vorlagen), da es verschiedene Berechnungsverfahren zur MC-Simulation gibt.
Gruß,
Uwe
Anzeige
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.
Anzeige
AW: Matritzenmultiplikation - Fehler?
11.10.2006 22:49:42
ingUR
Hallo, Jens,
hier ein paar erste Fragen zu Deiner Programmprozedur "würfeln":
  • Die Matrix "Choleski" hat die Größe (Zeilen * Spalten) 12 * 3 gemäß der Zuweisung Choleski = Range(Cells(45, 18), Cells(56, 20)), jedoch auf welchem Tabellenblatt befindet sich die Matrix? In der weiteren Betrachtung gehe ich davon aus, dass sie sich auf dem (aktiven!) Arbeitsblatt "Monte-Carlo" sich befindet.
    Generell gilt jedoch, dass Du nicht eine Variable Choleski füllen willst, sondern einem Range-Objekt Choleski einen Zellenbereich zuweisen nußt, da Du weiter unten im Programm eine Matrixmultiplikation damit durchführst.
    Dim Choleski as Range
    Set Choleski = Range(Cells(45, 18), Cells(56, 20))
    .

    Programmteil, in dem das Objekt Choleski benutzt wird
    .
    Set Choleski = Nothing
    .
    .

    Hier könnte jedoch auch auf einen Namensbereich referenziert werden.
  • Mit n = Cells(52, 3) liest Du die Variable n aus einer bestimmten Zelle ein. Diese Zelle ist aber, wenn die Choleski-Matrix sich auch auf dem Tabellenbatt "Monte-Carlo" befindet, Bestandteil eben dieser Matrix! Da Du n als Anzahl der transponierten Matrix2 (Zufallszahlen) benutzt, könnte auch n aus der Spaltenzahl der Matrix (Range-Objekt) gewonnen werden: n = Choleski.Rows.Count.
  • Bei dem Füllen der Zufallszahlenmatrix läßt Du den Zeilenzähler Zeile von 0 bis n laufen und schreibst somit n+1(!) Zeilen, also eine Zeile mehr, als durch die Variable n vorgegeben wird. Dadurch stimmmen die Spaltenzahl der Choleski-Matrix und die Zeilenzahl der Zufallszahlen-Matrix nicht identisch!
    Deine Matrix liegt zudem bereits in die transponierten Matrixform vor.
  • Nun sieht es im Programmcode für mich so aus, als wenn die Schleife zum Füllen der Zellen das Produkt von zahlreichen Versuchen ist. Die MMULT- und MTRANS-Funktionen sind als Matrix-Formeln in Tabellenblättern einzugeben und erfordert als Argumente Zellbereiche, Matrix-Konstanten oder Bezüge. So verwendet, bedarf es keiner Schleife über die Elemete der neuen Matrix A*B. Sinnvoll wäre hier innerhalb der von Dir gesetzen Doppelschleife allenfalls das Summenprodukt, gebildet aus den Zeilenelement der Matrizen, Sumi=1,3(ai,k*bi,k) und das für alle 12*12 Elemente.

Da es m.E. zu verwirend wird, hier die verschiedenen notwendigen Änderungen im gegenseitigen Einklang zu erläutern, da sie verschieden Element benutzen (Daten-Array, Range-Objekte, Tabellenfunktion), habe ich mit erlaubt, den Programmteil grundlegend neu aufzubauen:
Option Explicit
' Cells(45, 18)
Const CHOLESKI_TOP = 2 '45
Const CHOLESKI_LEFT = 1 '18
' Cells(56, 20)
Const CHOLESKI_BOTTOM = 13 '56
Const CHOLESKI_RIGHT = 3 '20
' Cells(52, 3)
Const N_ROW = 52
Const N_COLUMN = 3
Const OUT_TOP = 30
Const OUT_LEFT = 1
Sub wuerfeln_Neu()
Dim Zeile As Integer
Dim Spalte As Integer
Dim n As Long, m As Long
Dim Choleski() As Double, Zufall() As Double
Dim Sum As Double, i As Long
m = 12 'Choleski.Rows.Count
n = 3 ' Choleski.Columns.Count
ReDim Choleski(m - 1, n - 1)
ReDim Zufall(m - 1, n - 1)
Worksheets("Monte-Carlo").Activate '(?) an dieser Stelle richtig plaziert?
For Zeile = 0 To m - 1
For Spalte = 0 To n - 1
Choleski(Zeile, Spalte) = Cells(CHOLESKI_TOP + Zeile, CHOLESKI_LEFT + Spalte)
'Kontrollausgabe
Cells(OUT_TOP + n + Zeile, OUT_LEFT + Spalte) = Choleski(Zeile, Spalte)
Next Spalte
Next Zeile
For Zeile = 0 To m - 1
For Spalte = 0 To n - 1
Zufall(Zeile, Spalte) = WorksheetFunction.NormSInv(Rnd)
Next Spalte
Next Zeile
'Kontrollausgabe
For Zeile = 0 To m - 1
For Spalte = 0 To n - 1
Cells(OUT_TOP + Spalte, OUT_LEFT + n + Zeile) = Zufall(Zeile, Spalte)
Next Spalte
Next Zeile
For Zeile = 0 To m - 1 'Schleife über alle Zeilen der Choleski-Matrix
For Spalte = 0 To m - 1 'Schleife über alle Zeilen der Zufalls-Matrix
Sum = 0
For i = 0 To n - 1 'Schleife über die Summandenbildung
Sum = Sum + Choleski(Zeile, i) * Zufall(Spalte, i)
Next i
'Kontrollausgabe
Cells(OUT_TOP + n + Zeile, OUT_LEFT + n + Spalte) = Sum
Next Spalte
Next Zeile
End Sub

Ausgabe und die Konstanten für die Datenbereich sind nach Deinen Vorgaben zu verändern.
Soweit der erste Teil.
Gruß,
Uwe
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige