Anzeige
Archiv - Navigation
1696to1700
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
Inhaltsverzeichnis

Matrix aus Multiplikation zweiter Vektoren in vba

Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 13:42:39
Bernd
Hallo Forum,
ich möchte zwei Vektoren X und Y wie folgt multiplizieren und in einer Matrix ausgeben.
der Vektor X sei zum Beispiel X(x1,x2,x3) und der Vektor Y sei zum Beispiel Y(y1,y2).
Die Ausgabe-Matrix soll in diesem Fall dann 3*2 = 6 Felder besitzen und wie folgt die Multiplikation der beiden Vektoren ausführen.
M(Zeilenindex, Spaltenindex), die Matrix soll drei Spalten und zwei Zeilen besitzen
M(1,1) = x1 * y1
M(1,2) = x2 * y1
M(1,3) = x3 * y1
M(2,1) = x1 * y2
M(2,2) = x2 * y2
M(2,3) = x3 * y2
Wie geht das in vba , irgendwie stehe ich gerade auf dem Schlauch
Besten Dank vorab schon mal
Bernd

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 13:59:25
Hajo_Zi
Hallo Bernd,
genau nach Deiner Vorgabe.
Option Explicit
'X(x1,x2,x3) und der Vektor Y sei zum Beispiel Y(y1,y2).
Sub MatrixErt()
Dim Stwert1 As String
Dim StWert2 As String
Dim StArr1
Dim StArr2
Dim LoI As Long
Dim LoJ As Long
Stwert1 = "x1,x2,x3"
StWert2 = "y1,y2"
StArr1 = Split(Stwert1, ",")
StArr2 = Split(StWert2, ",")
For LoI = 0 To UBound(StArr1)
For LoJ = 0 To UBound(StArr2)
Cells(LoI + 1, LoJ + 1) = StArr1(LoI) & "*" & StArr2(LoJ)
Next LoJ
Next LoI
End Sub

Beiträge von Werner, Luc, robert, J.O.Maximo und folgende lese ich nicht.
Die Beiträge werden auch ignoriert, es erfolgt keine Antwort.
Anzeige
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:04:23
Daniel
Hi
explizit ausprogrammieren:
redim M(LBound(Y) to Ubound(Y), LBound(X) to Ubound(X))
for zy = Lbound(Y) to Ubound(Y)
for zx = LBound(X) to Ubound(X)
M(zy, zx) = X(zx) * Y(zy)
Next zx
next zy 
du könntest auch Worksheetfunction.MMult nutzen, aber dann müssen X und Y zweidimensionale Arrays sein, wobei X eine Zeile und drei Spalten und Y zwei Zeilen und eine Spalte groß sind.
wenn X und Y als eindimensionale Vektoren vorliegen, kannst du die mit Worksheetfunction.Transpose umwandeln, wobei X nicht umgewandelt werden muss, weil eindimensionale Arrays bei Bedarf automatisch durch die implizite Typumwandlung in zweidimensionale Arrays mit einer Zeile gewandelt werden
M = WorksheetFunction.MMult(WorksheetFunction.Transpose(Y), X)

Gruß Daniel
Anzeige
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:09:16
Bernd
Hallo Daniel,
vielen Dank für deine Hinweise - noch eine kleine Frage - weißt du welcher Code schneller ist?
Der Code mit der WorksheetFunction MMult oder das explizite ausprogrammieren?
Bernd
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:23:05
onur
Die Geschwindigkeit spielt bei 6 Elementen keine Rolle, es sind vielleicht Mikrosekunden Unterschied.
Bei wesentlich grösseren Arrays (mit etlichen Tausend von Elementen würde ich die WorksheetFunction-Version nehmen.
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:43:00
Bernd
Hallo Daniel,
danke dir, ggf. teste ich das mal mit einer langen Schleife und messe die Zeit...
Beste Grüße
Bernd
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:27:28
Daniel
Hi
teste doch selber.
die erste frage wäre, um welche Datenmengen gehts und ist es überhaupt notwendig, diese Frage zu stellen, weils eh schnell genug ist?
aber ich würde mal MMULT favorisieren.
Gruß Daniel
Anzeige
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:43:54
Bernd
...hab ich mir dann auch gedacht, dass ich das selber testen kann...
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:45:48
Hajo_Zi
offen bedeutet es soll noch eine Antwort kommen.
Warum ist dein Beitrag Offen.
Du willst doch was machen. Soll jemand vorbei kommen?

AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 15:17:15
Bernd
Hast ja wie immer Recht :-)
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 15:11:19
Daniel
Hi
habe jetzt nochmal mit unterschiedlichen Excelversionen getestet.
in 2013 ist MMULT wesentlich schneller und funktioniert auch mit sehr großen Datenmengen
in 2010 ist MMULT auf maximal 65536 Elemente für das größere Array limitiert. die Geschwindigkeit für beide Varianten ist in etwa gleich, welche Variante scheller ist hängt davon ab, ob das größere oder das kleiner Array transponiert werden muss.
es scheint sich also was getan zu haben zwischen beiden Versionen.
Daher ist selber testen immer gut, denn es ist nicht wichtig, was bei mir mit ein paar Dummydaten schneller ist, sondern was bei dir mit deinen Daten schneller läuft.
nach meinen Testen würde ich für 2013 auf jeden Fall das MMULT empfehlen, und für 2010 bei großen Datenmengen die Schleife.
Gruß Daniel
Anzeige
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 15:16:36
Bernd
Daniel, danke dir - der Punkt mit den verschiedenen Excel-Versionen ist richtig gut!
Noch einen schönen Restspnntag!
Bernd
Kann als Spezialfall eines Kronecker-Produkts ...
24.06.2019 03:12:03
Luc:-?
…angesehen wdn, Bernd,
solange es sich dabei um die Multiplikation von Vektor (senkrecht) und Kovektor (waagerecht) handelt. Normalerweise geht's dabei aber um die Multiplikation 2er Matrizen mit dem Ergebnis eines idR in eine Matrix einge­falteten 3dTensors, was komplizierter aussieht, aber von Xl durchaus bewältigt wdn kann, obwohl es dafür keine eigene Fkt zV stellt wie bspw MatLab mit Kron.
In diesem Fall ist das aber nicht erforderlich, denn schon die einfache Multiplikation eines Kovektors(') mit einem Vektor ({=y*x'} bzw {=x*y'}) fktioniert in Xl so. Das Vertauschen der Faktoren ist hier auch bei komplizierteren Fmln* und diversen Fktt* zur Ermittlung des Kronecker-Produkts möglich, nicht aber bei MMULT ohne beide Tensoren zu transponieren, was dann allerdings auch die ErgebnisMatrix transponiert. Das deutet schon an, dass MMULT eine andere multiplikative Verknüpfung der Quellen vornimmt als das Kronecker-(Tensor-)Produkt, was dann bei Matrizen als Quellen zu anderen ErgebnisWerten führt.
* {=INDEX(y;ZEILE(1:2);1)*INDEX(x';1;SPALTE(A:C);1^y)} zu {=INDEX(x';;SPALTE(A:C);1)*INDEX(y;ZEILE(1:2);;1^x')} bzw {=TensEx(TensorProd(y;x';2))} zu {=TensEx(TensorProd(x';y;2))} oder {=TensEx(VJoin(INDEX(INDEX(y;ZEILE(1:2))*INDEX(x';;;1^y);;;1^y);"";2))} zu {=TensEx(VJoin(INDEX(INDEX(x';;SPALTE(A:C))*INDEX(y;;;1^x');;;1^x');"";2))}
Insofern ist die Anwendbarkeit von MMULT stets auf auf die Sonderfälle M⇐{=MMULT(y;x')} bzw M'⇐{=MMULT(x;y')} beschränkt und bei einem entsprd Produkt von Matrizen Y⊗X ≠ X⊗Y nicht gleichbedeutend.
Deshalb würde ich hier (neben der einfachen Fml für diesen SpezialFall) generell zu einer (optimierten) VBA-Lösung raten, denn die könnte bei entsprd Pgmmierung auch Matrizen nach dieser Methode multiplizieren und in quasi vereinfachter Form als größere Matrix darstellen, was MMULT nicht leisten kann und soll.
ArchivLinks:
TensorProd (Vs1.0) https://www.herber.de/forum/archiv/1616to1620/t1619687.htm#1619687
TensEx (Vs1.0-1) https://www.herber.de/forum/archiv/1608to1612/t1611005.htm#1613173 (u. #1613876)
VJoin wird hier in den Versionen 1.5ff benötigt. Anderenfalls muss das Ergebnis zu einer MatrixKonstante in TextForm ergänzt wdn →
VJoin (Vs1.4) https://www.herber.de/bbs/user/99024.xlsm

Morhn, Luc :-?
„Der beste Beweis für intelligentes Leben im Universum ist, dass noch niemand versucht hat, Kontakt mit uns aufzunehmen.“ H.Lesch, 2018, Sonneberg
Deshalb Intelligenz steigern mit …

Anzeige
Weiteres (auch aus dem neuen Thread)
26.06.2019 04:24:35
Luc:-?
So, Bernd,
noch einige Ergänzungen. Es gibt verschiedene Methoden, 2 Matrizen miteinander zu multiplizieren. Im Ergebnis wird idR eine Matrix entstehen (beim Kronecker-Produkt ist das nicht natürlich, sondern eine vereinbarte Darstellungsform), in einigen Fällen auch ein Ska­lar. Welche Methode die passende ist, wird vom jeweiligen ErgebnisZweck bestimmt, denn ihre Ergebnisse fallen idR unter­schied­lich aus. Die elementweise Multiplikation ist dabei die einfachste Form, setzt aber gleiche Größen der Matrizen bzw (Ko-)Vektoren voraus. Wird ein Vektor mit einem Kovektor multipliziert, entsteht eine Matrix, deren Form sich nach der ihrer Operanden richtet. Für MMULT-Anwen­dung gibt's dabei bindende Vorschriften, so dass die Operanden nicht einfach vertauscht wdn können. Diese Vorschriften machen sich dann besonders beim eigentlichen Zweck der Xl-Fkt, 2-Matrizen-MULTiplikation, bemerkbar und führen bei einem dem Kovektor (Arg1) gleich­langen Vektor (Arg2) zu einem skalaren Tensor(0,0) als Ergebnis. Damit entspräche das Ergebnis von MMULT(x';y) hier dem des Frobenius-SkalarProdukts SUMMENPRODUKT(x;y). Das wäre beim Kronecker-Produkt nicht der Fall und eine Matrix (aus 2 [Ko-]Vek­to­ren) das Ergebnis.
Xl weist ggüber anderer Calc-Software die Besonderheit auf, dass es das Kronecker-(Tensor-)Pro­dukt bei entsprd Fml-Aufbau 4dimen­sional berechnet. Allerdings können nur die Eckwerte auf ein TabBlatt abgebildet wdn, also die linken oberen Werte der ElementMatrizen des Ergebnisses. Und natürlich können die Matrizen unterschiedlich groß sein, da ja jedes Element der 1.Matrix mit jeweils allen der 2.Matrix multipliziert wird:
Bsp: Gegeben → A13:C14: {1.2.3;4.5.6} → A16:B17: {15.25;35.45}
Mit pluraler MatrixFml {=INDEX(A16:B17;ZEILE(1:2);SPALTE(A1:B3))*INDEX(A13:C14;;;1^A16:B17)} ergibt sich daraus die 2×2-Matrix {15.25;35.45} hinter der sich das 4dimensionale Datenfeld (Array) {{15.30.45;60.75.90}.{25.50.75;100.125.150};{35.70.105;140.175.210}.{45.90.135;180.225.270}} verbirgt. Das lässt sich in der 2×2-Matrix mit folgd (UDF-gestützter) pluraler MatrixFml sichtbar machen:
{=VJoin(INDEX(INDEX(A16:B17;ZEILE(1:2);SPALTE(A1:B3))*INDEX(A13:C14;;;1^A16:B17);;;1^A16:B17); ;-2) }
Die 2×2-Matrix lässt sich auch mit der UDF-gestützten pluralen MatrixFml {=TensorProd(A16:B17;A13:C14)} erzeugen, die mit 3.Argu­ment=2 eine von der UDF TensEx* in die übliche Darstellung einer größeren Matrix transformierbares Ergebnis liefert:
{=TensEx(TensorProd(A16:B17;A13:C14;2))}
* Unter den im oberen Beitrag genannten Links u/o dem Stichwort Tensor sind auch weitere Erläuterungen und grafische Darstellungen zu dieser Problematik zu finden.
Dadurch, dass hier zwischen Bildung des 4dimensionalen Datenfelds und seiner Extension in eine reguläre Matrix getrennt wird, können auch andere Operatoren (also Rechenarten) zum Einsatz kommen, zB …
• das Subtrahieren von zwei Matrizen, wenn es auf analoge Weise erfolgen soll. Natürlich kann dann nicht mehr die UDF TensorProd angewendet wdn, sondern nur die Xl-Fmln mit der UDF VJoin zur Abbildung der sonst nicht anzeigbaren Werte. Leider konnte ich die VJoin-Versionen ab 1.5ff noch nicht publizieren, da hierbei noch Bearbeitungsbedarf besteht. Die benötigte Form des Ergebnisses muss also durch Nachbearbeitung erzeugt oder eine kompliziertere Fml verwendet wdn, wenn eine derartige Subtraktion benötigt wird. Anderenfalls kann natürlich auch in VBA entsprd pgmmiert wdn (Hinweise im neueren Thread). Hierfür käme eine äußere Schleife über die Elemente der 1.Matrix und eine bei jedem Element der 1. lfd Schleife über alle Elemente der 2.Matrix infrage, denn man kann die besondere Xl-Berechnung nur mit Fmln nutzen, müsste sie in VBA ggf nachgestalten. Aber man könnte ja auch eine hybride Form wäh­len. Vielleicht lässt sich da ja was mit der vbMethode Evaluate und US-notiertem Fml-Text machen, falls INDEX dabei mal mitspielt, was oft nicht so ist.
Übrigens scheidet hierbei MMULT natürlich generell aus, während andere Operationsformen vom angetrebten Zweck und der dafür gewählten Methode abhängen.
• die Übergabe bzw Umbenennung einer Matrix
Einer Variant-Variablen kann man eine Array-Variable einfach zuweisen. Dann hat man sie doppelt, aber unter verschiedenen Namen. Man kann das auch mit Bereichen machen und sie dabei ggf auch in Datenfelder aus ihren Werten (ohne Bezug zu den Objekten) umwan­deln. Ein Vektor, dessen Elemente aus gleichlangen Kovektoren bestehen, kann nur als Ergebnis einer UDF in einer ZellFml automatisch in eine reguläre Xl-Matrix gewandelt wdn. Als Ergebnis einer SubProzedur muss man das ebenfalls pgmmieren.
• die optimale Multiplikation zweier Matrizen, wenn MMULT funktioniert für den Anwendungsfall
MMULT muss nicht nur fktionieren, sondern auch die für den jeweiligen Zweck richtige Methode sein, denn es gibt ja noch mehr (s. oben). Falls MMULT richtig sein sollte, wird man in VBA ja ohnehin die Bereiche/Datenfelder auf das notwendige Maß begrenzen (und in Xl-Fmln ist das hierbei ebenfalls erforderlich!). Bei anderen Methoden wdn idR beide Matrizen gleichgroß und gleicher Form sein müssen (nicht beim Kronecker-Produkt).
Ansonsten testen, was schneller ist → VBA-Nachbau (ggf inkl genannte UDFs) oder WorksheetFunctions (so vorhanden).
Morhn, Luc :-?
Anzeige
AW: Kann als Spezialfall eines Kronecker-Produkts ...
27.06.2019 20:00:02
Bernd
Hallo Luc:-?
Danke für die ausführlichen Erläuterungen und die zugehörigen Links Zugegebenermaßen verstehe ich momentan vieles von dem was du schreibst nur teilweise - dies liegt aber an mir und meinen mangelnden Kenntnissen.
Ich hoffe, dass ich mich bei weiteren Fragen an dich wenden kann.
Beste Grüße
Bernd
Nach dem Urlaub! Ciao! owT
29.06.2019 03:09:53
Luc:-?
:-?
AW: Matrix aus Multiplikation zweiter Vektoren in vba
23.06.2019 14:06:29
Bernd
Hallo Hajo,
das passt, vielen Dank, jetzt weiß ich auch wo mein Fehler war...
Bernd
Das war wohl nicht dein Ernst, ...
24.06.2019 01:39:00
Luc:-?
…Bernd, ;-]
denn dabei kommt das raus:
M(1,1)=x1*y1 - M(1,2)=x1*y2
M(2,1)=x2*y1 - M(2,2)=x2*y2
M(3,1)=x3*y1 - M(3,2)=x3*y2
Das stimmt ja wohl kaum mit deiner Vorgabe überein, denn Hajo hat x und y vertauscht und damit die Ausrichtung der Matrix. Also nichts mit genau nach deinen Vorgaben, abgesehen mal davon, dass das nur ein formales Ergebnis ist und keine Berechnung eines beliebigen VektorProdukts, schon gar nicht die des durchaus üblichen Kreuzprodukts, was du allerdings auch nicht haben wolltest (vgl meinen oberen Beitrag).
Luc :-?
Anzeige

301 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige