Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1616to1620
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

INDEX u.Kronecker-Produkt (3/4-Tensor - 4.Forts.)

INDEX u.Kronecker-Produkt (3/4-Tensor - 4.Forts.)
15.04.2018 01:12:04
Luc:-?
Ich hatte ja hier schon erwähnt, Leute,
dass sich snb erneut an der dort verlinkten Diskussion auf OL beteiligt hat, indem er ein „Dessert“ nachgeliefert hat. Ich werde nun im dortigen Thread darauf eingehen und ein „Sahnehäubchen“ nachliefern (Link folgt hier später). Hier geht's mir aber in 1.Linie um Erweiterungen und Korrekturen.
1. Wenn man 2 ungleichgroße Matrizen nach Art des Kronecker-Produkts miteinander multipliziert, merkt man schnell, dass die plurale MatrixFml unter Pkt 1.2, …
AB7[:AC8]: {=INDEX(INDEX($W$2:$X$3;ZEILE(A1:B2);SPALTE(A1:B2))*INDEX(Z2:AA3;;;1^Z2:AA3);0;0)}
…so nicht stimmen kann. Das Konstrukt 1^Z2:AA3 als 4.INDEX-Argument muss sich natürlich auf die 1.Matrix beziehen, nicht die 2., um die 2.Matrix oft genug bereit zu stellen und ggf alle Ergebnisse (1.Werte der Sekundärmatrizen = komplette 1.Subebene) abzurufen! Die Fml müsste also so lauten:
AB7:AC8: {=INDEX(W2:X3;ZEILE(A1:B2);SPALTE(A1:B2))*INDEX(Z2:AA3;;;1^W2:X3)} bzw …
AB7:AC8: {=INDEX(INDEX(W2:X3;ZEILE(A1:B2);SPALTE(A1:B2))*INDEX(Z2:AA3;;;1^W2:X3);;;1^W2:X3)}
Das würde dann analog auch für den Pkt 2.0 gelten, statt …
W12:X13: {=VJoin(INDEX(INDEX(W2:X3;ZEILE(A1:A2);SPALTE(A1:B1))*INDEX(Z2:AA3;;;1^Z2:AA3);;;1^Z2:AA3);",;";2)}
…wäre Folgendes zu verwenden:
W12:X13: {=VJoin(INDEX(INDEX(W2:X3;ZEILE(A1:B2);SPALTE(A1:B2))*INDEX(Z2:AA3;;;1^W2:X3);;;1^W2:X3);",;";2)}
2. Die zuletzt genannte Fml erzeugt ja MatrixKonstanten in TextForm*. Diese Ergebnisse können aber nur aus ihren Zellen als Quelle genutzt wdn. Speichert man sie als Werte mit vorangestelltem = und berechnet man dann die EinzelFmln, entsteht genau wieder das xlErgebnis lt 1.Subebene des 4Tensors. Man kann ihre Zellen aber als Argument der UDF TensEx verwenden (s. im verlinkten Archiv-Thread!). In Vs1.0 wdn dann die Werte dieser MxKonstantenTexte auf die übliche (2dimensionale) Ergebnismatrix (2Tensor) expandiert (Sekundärmatrizen-Darstellung). Mit der Vs1.1 (herstellbar aus 1.0 per im Archiv-Thread angegebener Ergänzung) kann man dann auch die Subebenen aus diesen Hilfszellen extendieren. Wenn man die beiden FaktorMatrizen ggeinander austauscht, wdn übrigens auch Sekundärmatrizen- und Subebenen-Darstellung ggeinander ausgetauscht.
__________
* Wer nicht über die dafür erforderliche Vs1.5 der UDF VJoin verfügt, kann auch die Vs1.4 benutzen und muss die Ergebnisse entsprd ergänzen, wenn er die UDF TensEx zwecks Weiterverarbeitung benutzen will.
3. Inzwischen habe ich aber auch eine weitere UDF fertiggestellt, die direkt das TensorProdukt ermittelt, es aber als Matrix, deren Elemente ebenfalls Matrizen sind, anlegt. So etwas kann normalerweise nicht auf einen ZellBereich abgebildet wdn, weshalb Xl hier zwar sicher analog rechnet (Beweis: die VJoin-Fmln!), die xlSteuerung aber trotzdem die 1.Subebene abbildbar isoliert. Das habe ich auch in dieser UDF simuliert (bei fehlendem 3.Argument). Ansonsten können alle TensorWerte nur als MxKonstantenText, wahlweise in US-Original- bzw lokaler Notation ausgegeben wdn (spart VJoin ein). Eine solche Fml kann man dann auch der UDF TensEx als Argument übergeben, die dann Expansion bzw Extension besorgt.
Rem Ermittelt Kronecker-Tensor-Produkt von 2 Matrizen als 2/2d-Array,
'   was einem 4-Tensor gleichkommt; Arg1-2: jedes Element v.Arg1 wird
'   mit allen Elementen von Arg2 multipliziert u.die Ergebnismatrizen
'   in einer Matrix gleicher Größe wie Arg1 elementweise gespeichert;
'   Arg3: fehlt/0 Ausgabe der 1.Subebene (xlSimulation) um F-Werte zu
'   vmeiden, ±1/2 Rückgabe aller Werte als Texte in Matrixkonstanten-
'   form (Sekundärmatrizen), ±2 erzeugt US-Notation, die v.UDF TensEx
'   benötigt wird (m. dieser können die Texte zu 2d-Matrizen üblicher
'   Form expandiert bzw auf d.Subebenen d. 4d-Modells extendiert wdn.
'   Vs1.0 - LSr:CyWorXxl -cd:20180414 -1pub:20180415h -lupd:20180414t
Function TensorProd(ByVal Matrix1, ByVal Matrix2, Optional ByVal alsMxKText As VbTriState)
Const txMxForm$ = "{#}"
Dim cx1 As Long, cx2 As Long, ix As Long, rx1 As Long, rx2 As Long, _
MxCSep, MxRSep, zlErg() As String, el, erg, it, zwErg As Variant
On Error GoTo fx
With Application
MxCSep = Array(",", .International(xlColumnSeparator))
MxRSep = Array(";", .International(xlRowSeparator))
End With
alsMxKText = -Abs(alsMxKText): erg = Matrix1: zwErg = Matrix2
Matrix1 = erg: Matrix2 = zwErg
ReDim erg(UBound(erg, 1) - LBound(erg, 1), UBound(erg, 2) - LBound(erg, 2))
ReDim zwErg(UBound(zwErg, 1) - LBound(zwErg, 1), _
UBound(zwErg, 2) - LBound(zwErg, 2))
For Each el In Matrix1
For Each it In Matrix2
zwErg(rx2, cx2) = el * it
rx2 = (rx2 + 1) Mod (UBound(zwErg, 1) + 1)
cx2 = (cx2 - CInt(rx2 = 0)) Mod (UBound(zwErg, 2) + 1)
Next it
If CBool(alsMxKText) Then
ReDim zlErg(LBound(zwErg, 1) To UBound(zwErg, 1))
For ix = LBound(zwErg, 1) To UBound(zwErg, 1)
zlErg(ix) = Join(WorksheetFunction.Index(zwErg, ix + 1, 0), _
MxCSep(alsMxKText + 2))
Next ix
erg(rx1, cx1) = Replace(txMxForm, "#", Join(zlErg, _
MxRSep(alsMxKText + 2)))
Else: erg(rx1, cx1) = zwErg
End If
rx1 = (rx1 + 1) Mod (UBound(erg, 1) + 1)
cx1 = (cx1 - CInt(rx1 = 0)) Mod (UBound(erg, 2) + 1)
Next el
If alsMxKText = vbFalse Then
With Application.Caller 'Simulation der Xl-Ausgabe m.INDEX
            ReDim zwErg(.Rows.Count - 1, .Columns.Count - 1)
For rx1 = 0 To .Rows.Count - 1
For cx1 = 0 To .Columns.Count - 1
zwErg(rx1, cx1) = erg(rx1, cx1)(0, 0)
Next cx1
Next rx1
End With
TensorProd = zwErg
Else: TensorProd = erg
End If
fx: If CBool(Err.Number) Then TensorProd = CVErr(Err.Number)
End Function
Morrn, Luc :-?
„Die Intelligenzmenge ist auf diesem Planeten eine Konstante, die Bevölkerung nimmt aber zu!“ Auch deshalb informieren mit …

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

Betreff
Datum
Anwender
Anzeige
FmlKorrektur
16.04.2018 02:45:56
Luc:-?
Die alternative Fml für AB7:AC8 der Abb3 muss natürlich nicht …
AB7:AC8: {=INDEX(INDEX(W2:X3;ZEILE(A1:B2);SPALTE(A1:B2))*INDEX(Z2:AA3;;;1^W2:X3);;;1^W2:X3)}
…sondern so lauten:
AB7:AC8: {=INDEX(INDEX(W2:X3;ZEILE(A1:B2);SPALTE(A1:B2))*INDEX(Z2:AA3;;;1^W2:X3);;)}
Die neue Fml für W12:X13 ist aber richtig mit 2maligem 1^W2:X3!
Luc :-?
Anzeige
Wie berechnet Xl einen 4Tensor als Ergebnis?
20.04.2018 03:00:39
Luc:-?
Auch wenn den Meisten das bisher Geschriebene „zu hoch“ sein mag und der praktische Sinn nicht gesehen wird, will ich doch noch etwas hinzufügen.
Ich hatte ja schon erwähnt, dass INDEX noch deutlich vielseitiger ist, als in Standard-Tutorien gewöhnlich beschrieben wird. Hier will ich speziell auf das optionale 4.Argument dieser Xl-Fkt eingehen. Dieses dient gewöhnlich dazu, aus einem diskontinuierlichen GesamtBereich als 1.Argument einen bestimmten TeilBereich auszuwählen. Weitgehend unbekannt dürfte dagg aber sein, dass dieses 4.Argument auch verwendet wdn kann, wenn das 1.Argument ein Datenfeld ist, d.h., nicht an Zellen auf dem Blatt gebun­den ist. Der einfachste Fall eines solchen wäre dabei die Multiplikation eines Bereichs mit 1, was auch mit seiner Adresse voran­ge­stelltem -- erreicht wdn kann. Ein weiterer Fall wäre die Benutzung einer sog MatrixKonstanten als Arg1. Der Regelfall wäre aber, dass das Datenfeld aus der Berechnung einer Fml als Arg1 resultiert.
Natürlich kann ein Datenfeld nicht diskontinuierlich sein, weshalb das 4.Argument hier einen anderen Zweck erfüllt → man kann es nutzen, um das Datenfeld zu vervielfachen, wobei allerdings ein höherdimensionaler Tensor entsteht, da die Bemessungen des ErgebnisDatenfelds allein durch Arg4 festgelegt wdn. Jedes Element dieser/s ErgebnisMatrix/(Ko-)Vektors enthält dann wieder die/den gesamte/n Matrix/(Ko-)Vektor. Es entsteht im Falle einer Matrix also ein 4Tensor (4dimensional!), der natürlich nicht in Gänze auf ein Blatt abgebildet wdn kann. Xl zeigt dann nur den 1.Wert jeder Element-Matrix (andere Calc-Software nicht!). Das sähe dann so aus:
{=INDEX({2.3;4.5};;;{1.1.1;1.1.1}) ⇒ {{2.3;4.5}.{2.3;4.5}.{2.3;4.5};{2.3;4.5}.{2.3;4.5}.{2.3; 4.5}}
Auf dem Blatt ist dann allerdings nur {2.2.2;2.2.2} zu sehen!
Verwendet man die Fml aber mit VJoin (Vs1.5), erhält man alle (oben gezeigten) Werte:
{=VJoin(INDEX({2.3;4.5};;;{1.1.1;1.1.1});",;";2)}
Bei der Bildung des Kronecker(-Tensor)-Produkts entsteht der 4Tensor also bereits mit dem 2.Faktor (2.Matrix), weshalb man hier auch beide (vollständigen Fml-)Faktoren ggeinander austauschen kann. Anders sieht es aus, wenn man nur die 1.Argumente aus­tauscht und die anderen dem anpasst, also die Reihenfolge der Faktor-Matrizen selbst ändert. Wenn es in beiden Fällen die glei­chen Matrizen sind, wdn so die Sekundär- gg die Subebenen-Matrizen getauscht und umgekehrt.
Mit folgendem Bsp wird gezeigt, wie Xl bei der Tensor(-Produkt)-Bildungsfml-Interpretation vorgeht:
 ABCDEFGHIJKL
1
12 789 Xl-Lösungsweg der FormelWiederholung Mx2 f.Elemente Mx1 als 4Tensor34Mx1Mx2101112Teilung Mx1 12 {7,8,9;10,11,12}{7,8,9;10,11,12}56    in skalare     34{7,8,9;10,11,12}{7,8,9;10,11,12}Ergebnistensor  dito, alle SekundärmatrizenElemente     56 {7,8,9;10,11,12}{7,8,9;10,11,12}714  ==  {7.8.9;10.11.12}{14.16.18;20.22.24}  =Multiplikation der Mx1-Skalar-Elemente m.Matrix-Elementen des 4Tensors aus Mx22128(nur Abbildung der{21.24.27;30.33.36}{28.32.36;40.44.48}=  714H2:I4: {=INDEX(A1:B3;{1;2;3};{1.2})}35421.Subebene mögl.){35.40.45;50.55.60}{42.48.54;60.66.72} 2128K2:L4: {=VJoin(INDEX(D1:F2;;;{1.1;1.1;1.1});",;";2)}A5:B7: {=INDEX(A1:B3;{1;2;3};{1.2})*INDEX(D1:F2;;;{1.1;1.1;1.1})}E5:F7: {=VJoin(INDEX(INDEX(A1:B3;{1;2;3};{1.2})*INDEX(D1:F2;;;{1.1;1.1;1.1});;;{1.1;1.1;1.1});;2)}3542H6:I8: {=H2:I4*INDEX(TxEval(INDEX(K2:L4;{1;2;3};{1.2}));1;1)}
2
3
4
5
6
7
8
Durch die erfolgreiche Anwendung von VJoin kann hier also nachgewiesen wdn, dass Xl tatsächlich den gesamten 4Tensor berech­net. VJoin bildet dieses Ergebnis nur ab, trägt also nichts dazu bei. Mit der archivierten UDF TensEx (Vs1.1) können die so in Form von MatrixKonstanten über mehrere Zellen erzeugten Tensor-Inhalte in eine größere Matrix (2Tensor) zur SekundärMatrizenForm (übliche Darstellungsform des Kronecker-Produkts!) expandiert oder zur Subebenen-Form extendiert wdn. Mit der in diesem Thread enthaltenen UDF TensorProd kann der resultierende 4Tensor auch direkt erzeugt wdn, muss dann aber ebenfalls mit TensEx behan­delt wdn, wenn er vollständig angezeigt wdn soll.
Luc :-?
Anzeige
Nachschlag: Simulation mit VerbundZellen
21.04.2018 04:36:58
Luc:-?
Man kann diese Problematik auch mit VerbundZellen simulieren, um ganz einfache Fmln bilden zu können. Man muss sich dabei nur vorstellen, dass jede VerbundZelle nur eine einzige Zelle ist und die in der VerbundZelle verborgenen Daten in der Realität in die Tiefe der imaginierten Zelle reichen (im Speicher ist das bei kleinen >2Tensoren kein Problem), also quasi aus der 2d-Welt von Xl tief in die 4d-Raumzeit… ;-)
Um die Vorstellungskraft zu stärken, habe ich das folgende Bsp für Fans sinnvollen VerbundZellenEinsatzes kreiert:
Userbild
Die Matrix in F3:K8 dient hierbei nur zur Rückführung der Fml auf eine einfache Multiplikation von Bereichen (s. F17:K22). In der Realität wdn von Xl aber nur 6 Skalare aus Matrix1 erzeugt, von denen ein jeder mit einer der gleichen Elementmatrizen des erzeugten 4Tensors in F10:K15 multipliziert wird.
Zu den TensEx-Fmln ab F24 will ich noch anmerken, dass diese UDF auch direkt auf B24:C26 zugreifen könnte (wurde bereits zuvor gezeigt). Es ist sogar möglich, eine solche MatrixKonstante als Text direkt in Argument1 anzugeben. Außerdem könnte man mit der UDF VJoin auch eine „TensorKonstante“ bilden, die ebenfalls von TensEx expandiert …
{=TensEx(TensEx("{""{7,8,9;10,11,12}"",""{14,16,18;20,22,24}"";""{21,24,27;30,33,36}"",""{28,32,36; 40,44,48}"";""{35,40,45;50,55,60}"",""{42,48,54;60,66,72}""}")) }
… bzw extendiert wdn könnte:
{=TensEx(TensEx("{""{7,8,9;10,11,12}"",""{14,16,18;20,22,24}"";""{21,24,27;30,33,36}"",""{28,32,36; 40,44,48}"";""{35,40,45;50,55,60}"",""{42,48,54;60,66,72}""}");0) }
Luc :-?
Anzeige
Zurück zum Anfang - Resümee
22.04.2018 01:41:29
Luc:-?
Aus der VerbundZellen-Darstellung der Problematik ergibt sich, dass die Ermittlung eines Tensor-Produkts (4Tensor) in beiden Ergeb­nis-Darstellungsformen (als 2Tensor), der üblichen in Form der Sekundär­matrizen und der an den Tensor(-Sub)-Ebenen orien­tier­ten, auch nur mittels INDEX absolviert wdn kann; man muss nur für jedes ErgebnisMatrixElement die (sich auch wieder­ho­len­den) Mul­ti­plikationsFaktoren als Elemente der QuellMatrizen festlegen. In einer pluralen MatrixFml über einen ganzen (größeren) ZellBereich ist das ja auch kein Problem. Zusammenfassende einzellige Fmln (wie manche mit VJoin) würden dabei allerdings ver­sagen müssen. So wären also auch folgende Fmln möglich …
• Sekundärmatrizen-Darstellung (übliche Kronecker/Zehfuss-Produkt-Darstellung) als 2Tensor:
  {=INDEX(B3:C5;{1;1;2;2;3;3};{1.1.1.2.2.2})*INDEX(B10:D11;{1;2;1;2;1;2};{1.2.3.1.2.3})} bzw
  {=INDEX(B3:C5;GANZZAHL((ZEILE(1:6)-1)/2)+1;GANZZAHL((SPALTE(A:F)-1)/3)+1)*INDEX(B10:D11;REST(ZEILE(1:6)-1;2)+1;REST(SPALTE(A:F)-1;3)+1)}
• Subebenen-Darstellung als zusammenhängender 2Tensor (⇒Matrix):
  {=INDEX(B3:C5;{1;2;3;1;2;3};{1.2.1.2.1.2})*INDEX(B10:D11;{1;1;1;2;2;2};{1.1.2.2.3.3})}
  {=INDEX(B3:C5;REST(ZEILE(1:6)-1;3)+1;REST(SPALTE(A:F)-1;2)+1)*INDEX(B10:D11;GANZZAHL((ZEILE(1:6)-1)/3)+1;GANZZAHL((SPALTE(A:F)-1)/2)+1)}
Natürlich müssen solche Fmln exakt der jeweiligen Situation angepasst wdn, was natürlich recht unkomfortabel ist. Auch lässt sich ein derart ermitteltes Tensor-Produkt nicht direkt in einer Fml weiterverwenden, es erfordert stets Hilfszellen (die direkte 4Tensor-Erzeugung viel weniger!). Eine universellere Fml wäre außerdem ungleich länger (wie snb auf OL gezeigt hatte, → vgl unter dem­ent­sprd Link!).
Damit schließt sich der Kreis und wir sind fast wieder am AusgangsPkt lt Abb3/1.1 im Thread der 3.Fortsetzung. Im Verlaufe jener und dieser Fortsetzung sollte aber gezeigt wdn, dass Xl auch direkt einen 4Tensor berechnen kann (noch dazu mit kürze­rer/ele­gan­terer Fml; man muss sich nur etwas einfallen lassen, um alle seine Werte nutzen zu können. Falls der 4Tensor aber in Gänze direkt in einer ZellFml weiter­benutzt wdn soll, führt wohl kein Weg an einer speziellen Fkt (UDF) vorbei…
Dass in B17:C19 die plurale MatrixFml {=INDEX(B3:C5;{1;2;3};{1.2})*INDEX(B10:D11;;;{1.1;1.1;1.1})} tat­säch­lich einen 4Tensor berechnet, lässt sich übrigens nicht nur mit der UDF VJoin nachweisen, sondern auch mit der Xl-Fkt SUMME! Mit einer der VJoin- ana­logen pluralen MatrixFml wdn nämlich die Summen der Sekundärmatrizen gebildet (obwohl nur deren 1.Werte angezeigt wdn):
{=SUMME(INDEX(INDEX(B3:C5;{1;2;3};{1.2})*INDEX(B10:D11;;;{1.1;1.1;1.1});;;{1.1;1.1;1.1}))}
Dies könnte ggf auch für die Bildung von Teilsummen in anderen Zusammenhängen von Interesse sein (falls das nicht mit einfacher INDEX-Auswahl der Werte möglich oder doch zu aufwendig sein sollte)…
Luc :-?
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige