Microsoft Excel

Herbers Excel/VBA-Archiv

Vorab-Halloween: Was ist hier los?

Betrifft: Vorab-Halloween: Was ist hier los? von: Luc:?
Geschrieben am: 28.10.2020 02:57:20

Hallo, Leute;
habe nach Halloween wahrscheinlich wenig Zeit (falls es Corona zulässt), weshalb ich schon heute eine sehr spezielle Seltsamkeit vorstelle, die außerdem unterschiedliche Ergebnisse in Xl und LOcalc liefert.
Gegeben seien folgende 2 Matrizen (hier in Matrixkonstantenform dargestellt):
Mx1 - M41:O45: ={15.14.13;12.11.10;9.8.7;6.5.4;3.2.1}
Mx2 - M47:Q49: ={10.20.30.40.50;60.70.80.90.100;110.120.130.140.150}
Diese wdn miteinander auf bestimmte Weise multipliziert (eine von mehreren mathematisch zulässigen Methoden) und dann vom Ergebnis die Summe gebildet, also das, was auch SUMMENPRODUKT macht, nur eben mit anderer Produkt-Berechnung. Die Multiplikationsformel (~Fml) Mx1⊗Mx2 dafür lautet so (plurale MatrixFml):
{=INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45)}
Daraus ergibt sich in Xl folgende Ergebnismatrix:
M51:O55: ={150.140.130;120.110.100;90.80.70;60.50.40;30.20.10}
Also eine Matrix, die genauso groß und gerichtet ist wie Mx1. Bildet man über diese Zellen die Summe, erhält man als Ergebnis 1 200. Verwendet man aber die Multiplikationsfml als Argument der xlFkt SUMME, erhält man 18 000, aber natürlich nur als singulare MatrixFml (gilt auch für SUMMENPRODUKT und auch mit einem umfassenden INDEX, ggf mit gleichem 4.Argument wie Mx2, in allen Fällen auch mit AGGREGAT, ändert sich daran nichts)!
Als ob das noch nicht genug wäre, liefert LOcalc hier ein drittes Ergebnis, nämlich 5 970, was mit der Summe der Ergebniswerte einer vereinfachten Multiplikationsfml identisch ist. Diese lautet sowohl in LOcalc als auch Xl so (und liefert zT andere Ergebniswerte):
{=INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*M47:Q49}
Verwendet man diese Fml als Argument von SUMME ergibt sich wiederum das gleiche andere Ergebnis wie mit der erweiterten Fml → 18 000!
Für Alle, die sich mit dem Einsatz von MatrixKonstanten als Fml schwer tun, hier das Wesentliche nochmal als HTML-Tabellen, die auch ohne Kopfzeile und Vorspalte kopiert wdn können, aber dann bitte (auch bei Verwendung der MatrixKonstanten!) entweder an genau diese Stellen eines Blattes kopieren oder die Bezugsadressen entsprd ändern!

 MNOPQRS
40
INDEX Teil 2
151413 LOcalc  
121110 150280390
987 720770800
654 990960910
321beide ∑ in LOc:5 9705 97018 000
   {=INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*M47:Q49}2.∑ in Xl
1020304050  
60708090100  
110120130140150  
41
42
43
44
45
46
47
48
49
 MNOP
50
{=INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45)}
150140130 
120110100 
908070 
605040 
302010 
51
52
53
54
55
Wie unschwer aus dem Titel der Darstellung zu erkennen ist, handelt es sich hierbei um die lange versprochene Fortsetzung der INDEX-Ausführungen vom SommerAnfang, die auch einen Bezug zu einem weiteren zwischenzeitlichen Beitrag haben, auf den ich ggf später noch eingehen werde.
Nicht übersehen, die Frage stand im Betreff! ;-)
Morhn + gute Ideen, Luc :-? 🙈 🙉 🙊 🐵
„Die universelle Befähigung zur Unfähigkeit macht jede menschliche Leistung zu einem unglaublichen Wunder.“ Stapps ironisches Paradoxon

Betrifft: AW: durch "plurale" MF wird mE "verschleiert", ...
von: neopa C
Geschrieben am: 28.10.2020 08:58:35

Hallo Luc,

... wie sich die relative und absoluten Bezüge in den von Dir definierten Argumenten wirklich für die Berechnung auswirken. Die so ermittelten Ergebniswerte kann man natürlich auch durch singuläre Matrixformeln (MF) 1:1 nachstellen. Dafür muss man lediglich teilweise die Bezüge in den Argumenten von relativ auf absolut ändern. Dann wird es auch schneller/einfacher nachvollziehbar, dass derartige Ergebniswerte in der Praxis wohl kaum wirklich angestrebt wird und diese Auswertungsart nur für Halloween geeignet ;-) bleibt.

Gruß Werner
.. , - ...

Betrifft: Die "plurale" MF "verschleiert" streng genommen …
von: Luc:?
Geschrieben am: 28.10.2020 16:13:34

…nichts, Werner;
sie dürfte für diese Form sogar unbedingt erforderlich sein. Andererseits kann man die SummenFml mit der Multiplikationsfml als Argument tatsächlich auch als singulare MatrixFml einsetzen und über einen gleichgroßen ZellBereich wie Mx1 ziehen und erhält dann 15 unterschiedliche Summen, die in der Summe dann das wahre Ergebnis zeigen. Hierbei kann man allerdings auch auf das INDEX-Konstrukt um Mx2 verzichten, aber das ist ja gerade so interessant, denn diese Wirkung des 4.Arguments von INDEX wird nirgendwo erwähnt!
Und weil Du die Praxis ansprichst und für die Summe richtig erkannt hast, was passiert (wie auch zu erwarten war ;-]), habe ich noch eine Vereinfachung für Dich, die Gesamtsumme des ganzen Konstrukts entspricht dem Produkt der Summen der Matrizen, was hier 144 000 ergibt:
=PRODUKT(SUMME(M41:O45);SUMME(M47:Q49))
Mathematisch kann man das allgemein auch so schreiben: ∑(n,mi,j=1aij ·B)≙∑(A⊗B)⇔∏(∑A,∑B)≙∑A· ∑B
Um das A⊗B wird es später noch gehen, aber es könnte Dir bekannt vorkommen…
Und praxisnützlich ist das durchaus, denn nach dem Prinzip kann man Matrizen auch vervielfachen, stapeln und ggf auch anderen „Schabernack“ treiben. Dazu wie gesagt später mehr.
Gruß, Luc :-?

Betrifft: AW: das PRODUKT() der Matrxsummen ...
von: neopa C
Geschrieben am: 28.10.2020 17:40:37

Hallo Luc,

... ist für mich eher nachvollziehbar.

Wie bereits geschrieben, Deine plurale Matrixformel in M51:O55 kann problemlos auch durch eine äquivalente einfachere singulare MF ersetzt werden. Diese bedarf nämlich nicht des von Dir entdeckten 4. Arguments von INDEX(). Die evtl. Möglichkeiten die sich mit diesem auftun, übersteigen zumindest momentan auch meinen Horizont.

Gruß Werner
.. , - ...

Betrifft: Wie gesagt, das hat Vorteile und ist sinnvoll, ...
von: Luc:?
Geschrieben am: 29.10.2020 04:13:25

…Werner,
u.a.a., weil man so lange Fmln vermeiden kann, denn alle zu berechnenden Daten sind ja bereits vorhanden und müssen nur herausgelockt wdn. Damit meine ich speziell die Multiplikationsfml, denn die könnte wie so vieles aus der Mathematik erst im EDV- und Informatik-Zeitalter praktische Bedeutung bekommen. Die Grundlage dafür stammt nämlich aus dem 19.Jhdt!
Aber dazu heute Nachmittag/Abend mehr, denn das war ja bisher nur der Einsteiger. Da ist noch mehr… ;-)
Bis dann, Luc :-?

Betrifft: Also gelegentlich schön nachrechnen, ...
von: lupo1
Geschrieben am: 28.10.2020 09:12:01

... was Excel einem so bietet.

Man erinnere sich an den Bug von XL2007, als statt 65.536 als Ergebnis zu einer mir entfallenen Aufgabe plötzlich 100.000 erschien. Wurde im Servicepack behoben.

Betrifft: AW: das war, ist und bleibt immer sinnvoll...
von: neopa C
Geschrieben am: 28.10.2020 09:38:07

Hallo,

... also zwar nicht unbedingt 1:1 nachrechnen aber eine überschlägige Plausibilitätsprüfung.

Schon als wir die ersten schriftlichen größeren Operationen oder diese durch Handhabung des Rechenschiebers ausführten und als wir später die Taschenrechner anwenden und natürlich auch wir die immer komfortableren Rechenprogramme einsetzten.

Denn das von Luc hier aufgezeigte, ist mE kein Programm-Bug sondern er zeigt nur auf, wie man durch spezifische Anwendung der Möglichkeiten des Programms natürlich immer auch scheinbar fehlerhaftes erzeugen kann.

Gruß Werner
.. , - ...

Betrifft: Richtig, das ist weder ein Bug noch fehlerhaft, …
von: Luc:?
Geschrieben am: 28.10.2020 15:15:07

…Werner & Lupo,
sondern ein Alleinstellungsmerkmal von Xl. Die Original-INDEX-Pgmmierer (viell schon die von Lotus 1-2-3) haben hier etwas getan, was die späteren NachPgmmierer in anderer Software nicht machten, sie haben eine größer als 2dimensionale Berechnung vorgenommen und trotzdem auch eine Teilabbildung der ErgebnisWerte zugelassen. Außerdem begründet das Ganze auch eine neue Kategorie/Variante* von MatrixFmln, die auch in neuesten Versionen nicht anders behandelt wdn und idR weiterhin MatrixFml-Form erfordern.
Das macht Xl-INDEX noch „besonderer“ als besonders, nämlich einzigartig°, sozusagen XXL…!
* Vor allem dann, wenn man die Multiplikationsfml mit einem zusätzlichen umfassenden INDEX ala Mx2 „normalisiert“/stabilisiert, was allerdings keine Auswirkungen auf die Summenbildung hat.
° Ich wüsste auch nicht, wie man das in VBA nachprogrammieren könnte, ohne auf einen Großteil der Ergebniswerte zu verzichten.

Gruß, Luc :-?

Betrifft: Zwischenbilanz
von: Luc:?
Geschrieben am: 29.10.2020 19:19:42

Damit wären wir jetzt soweit:
 MNOPQRS
40
INDEX Teil 2
151413 LOcalc  
121110 150280390
987 720770800
654 990960910
321beide ∑ in LOc:5 9705 97018 000
   {=INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*M47:Q49}2.∑ in Xl
1020304050  
60708090100  
110120130140150  
{=INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45)}
150140130 18 00016 80015 600
120110100 14 40013 20012 000
908070 10 8009 6008 400
605040 7 2006 0004 800
302010 3 6002 4001 200
1 20018 000144 000 144 000∑ Gesamt144 000
∑ Ebene1∑ Matrix1∑ Gesamt {=SUMME(INDEX($M$41:$O$45;ZEILE(A1);SPALTE(A1))*$M$47:$Q$49)}
18 0001 200144 000 ⇒SUMME(TensEx(U41:W45)) ⇒SUMME(Q51:S55)
150300450600750  
9001 0501 2001 3501 500  
1 6501 8001 9502 1002 250  
{=INDEX(M47:Q49;ZEILE(1:3);SPALTE(A:E))*INDEX(M41:O45;;;1^M47:Q49)}
1 2002 4003 6004 8006 000  
7 2008 4009 60010 80012 000  
13 20014 40015 60016 80018 000  
   ∑ Gesamt144 000  
{=SUMME(INDEX($M$47:$Q$49;ZEILE(A1);SPALTE(A1))*INDEX($M$41:$O$45;;;1^$M$47:$Q$49))}
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Wobei im unteren Teil die FaktorMatrizen vertauscht worden sind, um zu demonstrieren, was dann passiert. Für die SummenBildung wurde an einer Stelle auch die UDF TensEx eingesetzt, die alle erzeugten Werte extendiert, um zu zeigen, dass hier tatsächlich alle Werte summiert wdn. Das Ergebnis ist dann natürlich das Gleiche wie bereits zuvor als Produkt der Summen beider Matrizen angekündigt.
Was die praktischen Anwendungsmöglichkeiten betrifft, käme neben dem hier gezeigten und eigentlich gemeinhin fälschlich als Kronecker-Matrix-Produkt (ein anderer Mathematiker hatte das bereits vor Kronecker entwickelt) die Vergrößerung einer gegebenen Matrix bzw ihre mehrfache Wiederholung infrage. Auch für eine platzsparende Datenspeicherung wäre so etwas von Interesse, weil so aus einer ggf mehrdimensionalen Struktur (resp mehrstufigen Tensoren) eine 2dMatrix [Tensor(1,1)] erzeugt wdn kann. Dazu hatte ich in diesem Zusammenhang bereits Einiges vor geraumer Zeit ausgeführt.
Mit Halloween 2013 fing es vor 7 Jahren mal an und ging dann mit verborgenen Daten und Tensoren weiter: Teil1, Teil2, Teil3 und Teil4, wobei der letzte Link (Teil4) für den jetzigen Beitrag den Vorläufer darstellt, dieser also die Wiederaufnahme bzw Fortsetzung des Themas darstellt. In diesem Jahr war ich aus anderer Perspektive schon mal auf diese Thematik eingegangen und hatte ein solches (Fml-)Ergebnis nach seiner Normierung und Fixierung in Analogie zu Matrix als Qubix (da es sowohl 3- als auch 4dimensional sein kann) bezeichnet. Das wird später noch eine Rolle spielen.
Hier nun noch ein Bsp zur Erzeugung einer 3fach vervielfältigten Matrix, die im Ergebnis der Fml natürlich gestapelt, d.h., in 3 mit INDEX nicht-indizierbaren Schichten bzw Ebenen vorliegt. Mit der UDF VJoin kann das aber sichtbar gemacht wdn und das ist auch die Grundlage einer Fixierung aller Werte, von denen sonst ebenfalls nur die oberste Ebene im TabBlatt sichtbar wäre. Sind die Werte aber fixiert worden, können die Ebenen auch mit einer klassischen INDEX-Fml isoliert wdn.
Gegeben sei folgende Matrix (eigentl die oberste Ebene der fixierten vorherigen Matrix-Multiplikation):
M51:O55 ⇒ Q73:S77: ={150.140.130;120.110.100;90.80.70;60.50.40;30.20.10}
Mit der pluralen MatrixFml (so nur mit VJoin ab Vs1.5, liegt Dir, Werner, vor!) …
{=VJoin(INDEX(INDEX(Q73:S77;ZEILE(1:5);SPALTE(A:C))*INDEX({1.1.1};;;1^Q73:S77);;;1^Q73:S77);"";2)}
…(umfassendes INDEX dient der dafür notwendigen Normierung!) wird daraus …
 XYZ
80
{150,150,150}{140,140,140}{130,130,130}
{120,120,120}{110,110,110}{100,100,100}
{90,90,90}{80,80,80}{70,70,70}
{60,60,60}{50,50,50}{40,40,40}
{30,30,30}{20,20,20}{10,10,10}
81
82
83
84
(MatrixKonstanten in US-OriginalNotation f.Weiterverarbeitung mit vbFkt Evaluate!)
Unter Einsatz der unter den Tensor-Links (Teil1-4) oder direkt unter ihrer maussensitiven Bezeichnung zu findenden UDF TensEx kann man entweder ihre Matrizen extendieren (Zeile 80-84) oder ihre Ebenen expandieren (Zeile 85-89):
 AFAGAHAIAJAKALAMAN
80
150150150140140140130130130
120120120110110110100100100
909090808080707070
606060505050404040
303030202020101010
150140130150140130150140130
120110100120110100120110100
908070908070908070
605040605040605040
302010302010302010
81
82
83
84
85
86
87
88
89

Soweit fürs Erste — Fortsetzung zu den restlichen Punkten folgt!
Luc :-?

Betrifft: AW: Bedarf es das 4. Arg. von INDEX() wirklich ...
von: neopa C
Geschrieben am: 31.10.2020 10:24:25

Hallo Luc,

... ich erkenne an Deinem Beispiel leider noch nicht, das das 4. Argument einen zusätzlichen Nutzen erbringt. In dem von Dir aufgezeigten, kann man das gleiche Ergebnis leicht auch ohne dieses 4. Arg. erzeugen und zwar als klassische Matrixformel so:

{=SUMME(INDEX($M$47:$Q$49;ZEILE(M1);SPALTE(A1))*INDEX($M$41:$O$45;;))}

oder natürlich auch ganz ohne {} so:

=SUMME(INDEX(INDEX($M$47:$Q$49;ZEILE(M1);SPALTE(A1))*INDEX($M$41:$O$45;;);))

Wie auch immer, wir sind uns darin einig, dass INDEX() schon gewisse Superfunktionaliät besitzt.

Gruß Werner
.. , - ...

Betrifft: Natürlich, ...
von: Luc:?
Geschrieben am: 01.11.2020 04:26:20

…Werner,
die klassische Darstellung des Kronecker-Produkts* (quasi hier die Basis) kann man ja auch mit ellenlangen Fmln erreichen, weil die Ergebnisse ja auch noch an den richtigen Stellen positioniert wdn müssen. Das hatte ich damals auch schon gezeigt, ist aber nicht mein Anliegen. Ich will direkt nutzen, was Xl ohnehin macht und erstaunlicherweise hierbei die flfd Zeilen-Spalten-Eintragsregel des Interpreters bricht, obwohl das in der Hilfe überhaupt nicht erwähnt wird. Andere Software hat anscheinend genau das nachpgmmiert, was in der Xl-Fktshilfe steht und arbeitet mit den dort gezeigten 2 Varianten, die für Datenfelder (ggf aus TeilFmlBerechnung) nur 2 zusätzliche Argumente vorsehen, für Bereichsbezüge aber deren 3 (etwas Anderes steht auch in diversen Xl-Blogs nicht, so dass man wohl davon ausgehen kann, dass das weitgehendst unbekannt ist). Dabei fktioniert ein 4.Argument auch bei Datenfeldern im 1., nur hat es dann eine etwas andere Wirkung. Hier haben die Hilfe-Schreiber entweder nicht gewusst, was der Pgmmierer gemacht hat, oder der hat diese Wirkung selber nicht erkannt. Im 1.Fall wäre der einfach genial gewesen!
Meine Intentionen zu INDEX richten sich darauf, dessen Möglichkeiten voll auszunutzen. Leider haben seine Pgmmierer Xl nicht die Möglichkeit gegeben, mehr als 2 Dimensionen darzustellen bzw zu indexieren, so dass man hierfür VBA bemühen muss, um solche Ergebnisse zu fixieren (dann erst können sie mit Xl-Mitteln indexiert wdn). Genau das habe ich getan und werde das als Nächstes vorstellen.
* Mathematische Software wie MatLab hat dafür eine eigene Fkt, aber Xl kann das auch, nur eben 4dimensional.
Morhn + schöSo, Luc :-?

Betrifft: AW: hierzu nachgefragt ...
von: neopa C
Geschrieben am: 01.11.2020 14:48:49

Hallo Luc,

... was meinst Du mit Deiner Aussage: "... kann man ja auch mit ellenlangen Fmln erreichen, weil die Ergebnisse ja auch noch an den richtigen Stellen positioniert wdn müssen"?

Ich hatte in Bezug auf Deine Formel in M63 mit dem 4. INDEX()-Argument zwei kürzere Formeln aufgezeigt, die auch beliebig positioniert werden können und damit indirekt die Frage aufgeworfen, kannst Du ein Beispiel aufstellen, wo das angestrebtes Ergebnis nur mit Einsatz das 4. INDEX()- Arguments effektiver lösbar ist? Dann kann ich Deine Aussagen vielleicht etwas besser nachvollziehen.

Gruß Werner
.. , - ...

Betrifft: Man muss mit den Zeilen- u.SpaltenIndizes ...
von: Luc:?
Geschrieben am: 02.11.2020 02:08:47

…„jonglieren“, Werner,
um die Daten (als Ergebnis einer pluralen MxFml) so anzuordnen, dass sie entweder die Anordnung des oberen oder des unteren Teils der zuletzt gezeigten ErgebnisTabelle ergeben. Das kostet einige Überlegung. Beim Ziehen einer Normal- oder singularen MxFml mag das etwas einfacher gelingen, aber überlegen muss man trotzdem. Nutzt man aber das 4.Argument von INDEX (als Folge von 1en), liegen alle Werte stets an derselben Stelle (der 1.FaktorMatrix folgend) und müssen dort nur fixiert wdn (wobei die ursprüngl Fml verlorengeht, aber gerettet und ggf zurückgeschrieben wdn kann), wobei sie quasi einen TabbStapel bilden, den ich früher Qubus und ab diesem Jahr Qubix nenne, um dann mit wesentlich einfacheren StandardFmln separiert wdn zu können. Das kommt wie gesagt als Nächstes in diesem Thread.
Was ich hier zeige, konnte ich wohl nur entdecken, weil ich oft mit MxFmln arbeite. Das scheint doch noch eine andere Welt zu sein als die Bildung von NormalFmln, speziell solcher, die weitgehend interpreter-unabhängig Bereiche und Datenfelder verarbeiten.
Dass man ein ganz entfaltetes Ergebnis auch anders erreichen kann, ist also klar. Es ist nur nicht möglich, auf andere Weise solche Stapel zu bilden. Und die können sehr nützlich sein… ;-)
Morhn, Luc :-?

Betrifft: AW: genau des "jonglieren" wegens ...
von: neopa C
Geschrieben am: 02.11.2020 09:32:38

Hallo Luc,

... waren und sind mir die meisten plurale Matrixformeln "suspekt" und außerdem auch zu wenig flexibel bei Datenänderungen.

Auch sind leider Deine Ausführungen mir wieder nur allgemein, so dass ich sie nicht wirklich verstehe. Hast Du ein nicht konkretes Beispiel, die die Nützlichkeit gegenüber einer singularen Matrixformellösung ohne das 4. INDEX()-Argument?

Gruß Werner
.. , - ...

Betrifft: Ich hatte zuwenig Zeit, ...
von: Luc:?
Geschrieben am: 02.11.2020 20:43:05

…Werner,
aber es kommt ja noch der eigentliche HauptTeil! ;-)
Etwas vorgegriffen habe ich ja in dem anderen Thread bereits (INDEX-Verlängerung)…
Luc :-?

Betrifft: Daniels dortiger Vorschlag fktioniert hier ...
von: Luc:?
Geschrieben am: 03.11.2020 19:28:52

…aber nicht, Werner!
https://www.herber.de/forum/messages/1790667.html
Weder mit noch ohne 4.Argument. Es steckt also wohl mehr dahinter.
Luc :-?

Betrifft: Der Endspurt beginnt
von: Luc:?
Geschrieben am: 03.11.2020 19:37:39

Zuvor: Wenn der Thread aus dem sichtbaren Forum verschwendet, werde ich in jedem weiteren Beitrag einen Link auf den vorhergehenden Forumsbeitrag setzen, so dass (zeitnah!) auch weiter geantwortet wdn kann. Das sähe dann so aus:
https://www.herber.de/forum/messages/1790024.html
Luc :-?

Betrifft: GesamtBild mit fixiertem TabbStapel (Qubix)
von: Luc:?
Geschrieben am: 04.11.2020 04:06:26

Zuerst der Link auf den vorherigen Beitrag: https://www.herber.de/forum/messages/1790964.html
Und nun die Zusammenfassung des bisher Gezeigten mit Ergänzung des noch fehlenden Teils zu Normierung und Fixierung des ursprünglichen Ergebnisses als Qubix-TabellenStapel:

Die MatrixKonstanten in Zeilen 68-72 können mit VJoin ab Vs1.5 (liegt Dir vor, Werner) gebildet wdn. Allerdings muss die plurale MatrixFml erst noch durch ein umfassendes INDEX (von WF als „INDEX-Verlängerung“ bezeichnet) mit gleichem 4.Argument normalisiert wdn, was dann auch den beobachteten EinzelZell-NachRechnungseffekt auslöst (Daniels Vorschlag fktioniert hier nicht - vgl letzte AW an neopa!). Das hatte ich bereits früher gezeigt und müsste auch unter den zuvor gezeigten Links (bzw eher den Threads zum TensEx-Link hier ganz unten) zu finden sein. Die Fml dafür sähe dann so aus:
{=VJoin(INDEX(INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45);;;1^M41:O45);"";2)}
Hier habe ich stattdessen aber meine neue UDF Layers verwendet, die später noch ausführlicher behandelt und dargestellt wird:
{=Layers(INDEX(INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45);;;1^M41:O45);;;1)}
Mit dieser Argumentierung bildet sie alle berechneten Werte in Form von MatrixKonstanten ab, wobei entweder lokale (wie hier*) oder originale US-Notationsform gewählt wdn kann, was ja auch bei VJoin möglich ist.
* Die ZeilenTrenner (;) wdn in der hier von mir gewählten Schriftart etwas seltsam dargestellt, so dass man genau hinsehen muss, um einen Unterschied zum SpaltenTrenner (.) feststellen zu können.
Die nachfolgende Matrix mit dem dem Ergebnis in M51:O55 formal gleichen, aber fixierten Ergebnis, also dem gebildeten Qubix, wurde mit der ebenfalls später zu behandelnden SubProzedur BuildQStack erzeugt, indem statt der ursprünglichen Fml die sich aus ihr ergebenden MxKonstanten als Fml eingetragen wurden, wodurch der Qubix seine MxFml-Bindung verliert. Daraus können dann ebenso wie aus den MxKonstanten in Textform (als Fml-Ergebnis) mit der bereits früher vorgestellten UDF TensEx alle Einzelwerte in Matrizen- (klassisch) oder EbenenForm (Xl) dargestellt u/o damit weitergerechnet wdn, was in den nebenstehenden Zeilen gezeigt wird. Der Qubix zeigt so natürlich nur seine oberste Ebene. Deshalb steht links auch noch ein Bsp, wie man aus einer unteren Ebene, bezogen auf die blaue Zahl (80), einen bestimmten Wert (640) holen kann. Die 1.Variante mit UDF, die 2. mit XLM-Fkt und INDEX. Der eigentl Inhalt dieser Zelle ist unten rechts angegeben.
Unten links habe ich nochmal den Berechnungsvgl für die Summe des Kronecker-Produkts aufgeführt.
Morhn, Luc :-?
Fortsetzung folgt.

Betrifft: Präzisierender Nachtrag
von: Luc:?
Geschrieben am: 05.11.2020 02:05:45

Bezug auf: https://www.herber.de/forum/messages/1791006.html
Korrektur: Natürlich sollte es im Beitrag davor verschwindet, nicht verschwendet heißen.

Mit Qubix meine ich die 2dimensional (als Matrix) erscheinende Abbildung eines mit den genannten INDEX-Fmln zwar erzeugbaren, aber nicht vollständig verwertbaren, quasi 3-4dimensionalen DatenBlocks → jetzt Qubus genannt. Xl bietet zZ keine integrierte Möglichkeit, dessen Werte direkt zu indizieren, schon gar nicht, wenn sie schon auf dem TabBlatt abgebildet wurden. Die nicht dargestellten Werte gehen dann regelmäßig für einen sekundären Zugriff verloren, obwohl sie ja bei DateiÖffnen/-Schließen bzw bestimmten anderen Aktionen stets neu berechnet wdn. Sind sie als Qubix fixiert worden, ist das nicht mehr der Fall und sie können dann auch indiziert wdn.
Einen Qubus kann man also auch mit Xl-Fktt als Fml-Ergebnis erreichen, einen Qubix aber nicht. Das erfordert dann VBA.
Qubix-Vorteile:
• DatenObfuskation (ggf auch inkl dafür erforderlicher DatenVariation),
• platzsparender komprimierter Dateneintrag (speziell b.TabellenWeitergabe u.ggf -Archivierung),
• weitere Anwendungsformen könnten möglich sein; das kann jeder selbst überlegen.
So könnte man bspw die beliebten (und umstrittenen), gleich aufgebauten Monatsblätter nicht nur auf einem Blatt, sondern auch in einer einzigen Tabelle eines Blattes zusammenfassen. Das dürfte allerdings die Verwendung definierter Tabellen (ListObjects) ausschließen, falls darin auch Berechnungen vorgenommen wdn sollen. Auch deren ZuwachsAutomatismen wären hierbei ggf kontraproduktiv.

Als Nächstes würde ich einige Bspp zur Handhabung eines Qubix zeigen, was auf Fmln mit den UDFs TensEx und Layers hinausläuft. Den Abschluss bildet dann die Qubix-Erzeugung, bevorzugt direkt aus Layers heraus angestoßen.
Luc :-?
Fortsetzung folgt!

Betrifft: Qubix-Auswertung
von: Luc:?
Geschrieben am: 06.11.2020 18:06:32

Bezug auf: https://www.herber.de/forum/messages/1791249.html

Einen normierten und als Qubix fixierten 3-4dimensionalen Qubus-Datenblock kann man mit der UDF TensEx in Gänze nach 2 Varianten extendieren (seine Matrizen in Kronecker-Produkt-Darstellungsform) bzw expandieren (AneinanderReihung seiner Ebenen lt Xl-Darstellung). Beide stehen in einem Umkehrungsverhältnis zueinander, d.h., vertauscht man die Faktor-Matrizen bei der ProduktBildung, erhält man vorherige Ebenen als Matrizen und dito Matrizen als Ebenen. Das wird am anfänglich gewählten Bsp im Folgenden dargestellt:
 TUVWXYZAAABACADAEAFAGAHAI
46
 15 Elementematrizen (1.1 bis 5.3)MatrizenFml:{=TensEx(O68:Q72)}∑ Gesamt144 000
 150300450600750140280420560700130260390520650
∑ Matrix 1.19001 0501 2001 3501 5008409801 1201 2601 4007809101 0401 1701 300
18 0001 6501 8001 9502 1002 2501 5401 6801 8201 9602 1001 4301 5601 6901 8201 950
 120240360480600110220330440550100200300400500
 7208409601 0801 2006607708809901 1006007008009001 000
 1 3201 4401 5601 6801 8001 2101 3201 4301 5401 6501 1001 2001 3001 4001 500
 901802703604508016024032040070140210280350
 540630720810900480560640720800420490560630700
 9901 0801 1701 2601 3508809601 0401 1201 2007708409109801 050
 60120180240300501001502002504080120160200
 360420480540600300350400450500240280320360400
 660720780840900550600650700750440480520560600
 306090120150204060801001020304050
∑ Matrix 5.318021024027030012014016018020060708090100
1 200330360390420450220240260280300110120130140150
 15 Dimensionsebenen (1.1 bis 3.5)EbenenFml:{=TensEx(O68:Q72;0)}∑ Gesamt144 000
 150140130300280260450420390600560520750700650
 120110100240220200360330300480440400600550500
 908070180160140270240210360320280450400350
∑ Ebene 1.160504012010080180150120240200160300250200
1 200302010604020906030120804015010050
 9008407801 0509809101 2001 1201 0401 3501 2601 1701 5001 4001 300
 7206606008407707009608808001 0809909001 2001 1001 000
 540480420630560490720640560810720630900800700
 360300240420350280480400320540450360600500400
 18012060210140702401608027018090300200100
 1 6501 5401 4301 8001 6801 5601 9501 8201 6902 1001 9601 8202 2502 1001 950
 1 3201 2101 1001 4401 3201 2001 5601 4301 3001 6801 5401 4001 8001 6501 500
 9908807701 0809608401 1701 0409101 2601 1209801 3501 2001 050
∑ Ebene 3.5660550440720600480780650520840700560900750600
18 000330220110360240120390260130420280140450300150
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Am linken Rand der Tabellen wdn ausgewählte Matrix- bzw EbenenSummen gezeigt, oben rechts die GesamtSumme.
TensEx bildet zZ stets alle Matrizen bzw Ebenen in einer GesamtMatrix ab, während es mit der UDF Layers möglich ist, auch einzelne Ebenen als Matrix zu zeigen. Beide können sowohl mit MatrixKonstanten in TextForm als Fml-Ergebnis als auch mit in einem Qubix fixierten normalen MatrixKonstanten arbeiten. Dabei sollten sie im 1.Fall in US-OriginalNotation vorliegen.
Diese MatrixKonstanten in TextForm kann man, wie bereits gezeigt, mit Layers bilden, dafür aber auch die UDF VJoin (Version 1.5ff) benutzen (plurale MatrixFml):
{=VJoin(INDEX(INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45);;;1^M41:O45);"";2)}

Natürlich kann man die klassische GesamtMatrix-Darstellung des Kronecker-Produkts, das dadurch entsteht, dass jedes Element der 1.Matrix mit der ganzen 2.Matrix multipliziert wird, was in der Xl-Fml durch die entsprd vervielfachte Angabe des 4.Arguments der INDEX-Konstruktion der 2.Matrix erreicht wird, auch mit einer längeren pluralen MatrixFml oder einer darauf basierenden NormalFml, deren Argumente von Zelle zu Zelle entsprd variiert wdn, erreichen:
Matrizen: {=INDEX(M41:O45;(ZEILE(1:15)-1)/3+1;(SPALTE(A:O)-1)/5+1)*INDEX(M47:Q49;REST(ZEILE(1:15)-1;3)+1;REST(SPALTE(A:O)-1;5)+1)} bzw
Ebenen: {=INDEX(M47:Q49;(ZEILE(1:15)-1)/5+1;(SPALTE(A:O)-1)/3+1)*INDEX(M41:O45;REST(ZEILE(1:15)-1;5)+1;REST(SPALTE(A:O)-1;3)+1)}
Aber das ist komplizierter als die direkte Qubix-Nutzung. Zu dessen Bildung folgen dann demnächst Ausführungen und Pgmm.
Luc :-?
Fortsetzung folgt!

Betrifft: Qubus & Qubix: Ebenen & Matrizen - Darst & Zugriff
von: Luc:?
Geschrieben am: 09.11.2020 02:53:21

Bezug auf: https://www.herber.de/forum/messages/1791650.html

Hier komme ich auf den bereits zuvor auf der Abbildung in Q73:S77 gezeigten Qubix zurück. Es wurde gezeigt, wie man auf einen einzelnen Wert (blau) aus dem Qubix zugreifen kann. Nun wird gezeigt, wie eine ganze Ebene bzw Matrix aus dem Qubix isoliert wdn kann:
 ABACADAEAFAGAHAIAJAKALAMAN
90
Qubix-Ebene 2.3Qubus-Ebene 2.3Qubix-Matrix 3.2
1 2001 1201 040 1 2001 1201 040 80160240320400
960880800 960880800 480560640720800
720640560 720640560 8809601 0401 1201 200
480400320 480400320 AJ91:AN93: {=TxEval(TextOf(R75;0))}
24016080 24016080      
AB91[:AD95]:=INDEX(TxEval(TextOf(Q73;0));2;3)AF91:AH95: {=Layers(INDEX(INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45);;;1^M41:O45);2;3)}
91
92
93
94
95
96
Links und rechts wird der durch Fixierung entstandene Qubix benutzt, in der Mitte der direkt aus der normierten Bildungsfml entstehende Qubus. Wie zu sehen ist, kann hier Layers Zeilen- und SpaltenEbenenNrn des 4dimensionalen Qubus mitgegeben wdn. Diese können auch per Fml gebildet wdn, wenn man mehrere direkt aneinander setzen will. In diesem Fall ist aber eine 2.Variante praktischer, die statt dieser Angaben mit der Anfangsadresse des 1.ErgebnisBereichs (idR der 1.Ebene), mal relativ, mal absolut, auskommt, wobei sich die jeweilige Ebene aus Zeilen- und SpaltenAbstand zwischen der zuerst notierten relativen und der als nächstes Argument folgenden statischen absoluten Adresse ergibt.
Dazu mehr in den Anmerkungen zur UDF, die mit den Fixierungspgmm zusammen zum Abschluss als PgmPaket veröffentlicht wird.
Morhn, Luc :-?
Fortsetzung folgt!

Betrifft: ELFer-Intermezzo: TensQubix
von: Luc:?
Geschrieben am: 11.11.2020 18:06:46

Bezug auf: https://www.herber.de/forum/messages/1791998.html
(Da offensichtlich kein weiterer Antwort- bzw Diskussionsbedarf besteht, wird dieser Bezug hier wohl der letzte diesbzgl Service meinerseits sein.)

Die im vorletzten Beitrag gezeigten Exten- bzw Expandierungsmatrizen können natürlich auch als Ausgangsbasis einer Qubix-Bildung dienen. Dadurch würde der ganze Prozess praktisch umgekehrt oder im Falle normaler Tabellen (wie unter dem nachfolgd Link erklärt) erst ausgelöst.* Das kann aus Primär-( oder per Fml erzeugten )Daten (auch) mit der bereits früher vorgestellten UDF TensQubix erreicht wdn:

* Hier ist themagemäß nur der Umkehrungsaspekt von Interesse.
Demggüber ist die UDF Layers auf/für die Behandlung der normierten OriginalFml zur 3-4dimensionalen DatenblockBildung ausgelegt. Deren Pgm bildet dann zusammen mit dem der hier erneut angewendeten SubProzedur BuildQStack den Abschluss der diesjährigen Halloween-Serie (falls nicht doch noch hier zeitnah Fragen gestellt u/o weitere Diskussionen angestoßen wdn).
Luc :-?
Fortsetzung folgt!

Betrifft: Fortsetzung folgt!
von: Luc:?
Geschrieben am: 16.11.2020 00:06:23

Singularisierte plurale Matrixformeln
Luc :-?

Betrifft: Qubix-Fix per singularisierter pluraler Matrixfml
von: Luc:?
Geschrieben am: 17.11.2020 00:52:33

Wenn eine INDEX-Fml mit der sog INDEX-Verlängerung angelegt wird, wie zB hier (also für Argumente2/3=0/leer im äußeren INDEX-Konstrukt), ist zu beobachten, dass alle erzeugten Daten ein 2.Mal einzeln und in willkürlicher Reihenfolge berechnet wdn (Näheres wird im Thread unter dem o.g. Link beschrieben). Genau dieser Effekt wird auch durch die in Vorbereitung der Darstellung aller Werte des Kronecker-Produkts erforderliche Normalisierung des ErgebnisQubus dieser Multiplikation ausgelöst. Diese Form der ErgebnisNormalisierung kreiert folglich eine besondere Kategorie von MatrixFmln, die einerseits plural ist (alle Werte wdn auf 1× ermittelt und ggf eingetragen, sofern das mit den Xl-Regeln vereinbar ist*), andererseits aber einen (2.) EinzelDurchlauf für jede betroffene Zelle erfordert, was auch unter der neuen SelbstAusdehnungsregie von Xl nicht anders ist.
Dem tragen auch die Operationen der UDF zur Vorbereitung der bei entsprd Argumentierung automatisch ausgelösten und extern erfolgenden Fixierung Rechnung (die UDF wird im letzten Teil publiziert), indem für eine kurze (einstellbare) Zeit zwecks Kontrolle ReihenfolgeNr und ZellAdresse statt der obersten Werte der Fixierung (Qubix-Ebene1) gezeigt wdn. Da die anschließend folgenden 4 Prozeduren auch auf MatrixKonstantenTexte als Ergebnis der bereits publizierten (und verlinkten) UDF TensQubix angewendet wdn können, publiziere ich diese zuerst.
_____________
* Der WiedergabeBereich kann nicht größer sein als die 1.Matrix, deren Einzelwerte mit jeweils der ganzen 2.Matrix multipliziert wdn. Unter Xl wdn dann nur die jeweils 1.Werte der entstehenden Matrizen an den Positionen der 1.Matrix angezeigt, was sonst nicht so wäre (und in anderer Software nicht so ist).

Anwendungsvoraussetzung:
Im Dokument-Klassenmodul (.cls) des StandortBlattes (quasi seiner Rückseite im VBA-Projekt) der _ Qubus-Berechnung muss folgende EreignisProzedur eingetragen wdn:

Rem Ptx#2: AutoRuf BuildQStack b.Layers-Arg alsStapel=WAHR/1
Private Sub Worksheet_Calculate()
    If adQPZ <> "" And Not dStap Is Nothing Then _
        Call BuildQStack(Me.Range(adQPZ))
End Sub
Das sollte ggf erst erfolgen, nachdem die GlobalVariablen und die 3 anderen Prozeduren in einem normalen Modul (.bas) eingetragen wurden.
Fixierungs- u.Fml-Restore-Prozedur u.2 zusätzliche RufProzeduren
Option Explicit
Public isNonLocal As Boolean, adQPZ$, dStap As Dictionary

Rem Ptx#3: Aufruf BuildQStack f.MxKonstt (auch als FmlErgebnis) in US-OriginalNotation
'   Vs1.0 -LSr -cd:20201006 -1pub:20201116h -lupd:20201006t
Sub RufBQSnLokNotat(): Call BuildQStack(, True): End Sub

Rem Ptx#4: Aufruf BuildQStack f.Rekonstrukt ursprgl MxKonsttBildFml (fs in Kom'tar ex)
'   Vs1.0 -LSr -cd:20201005 -1pub:20201116h -lupd:20201005t
Sub RufBQSrebuildFml(): Call BuildQStack(, , True): End Sub

Rem Ptm#1: Erzeugung eines TabellenStapels durch zellweisen Eintrag v.MxKonstt als Fmln
'   bzw ggf WiedEintrag d.ursprgl BildFml, falls diese im Kommentar autogesichert wurde
'   (d.MxKonstt könn Ergebn in d.Zellen notierter Fmln sein or direkt d.globalen Ergeb-
'   nisSammelVariablen d.UDF Layers entnomm wdn, falls ds auf AutoErzeug gestellt ist.)
'   Param1: QuellZellBereich (nur b.AutoAufruf, sonst entfalld), falls n-vorhd wird akt
'   Z-Auswahl benutzt (1.Zelle b.MxFmlBereichen ausreichd, sonst alle Zellen auswähl!);
'   Param2: fehlt/0/false->MxKonstt in lokaler Notation, anderenfalls US-OriginalNotat;
'   Param3: dito->StapelBildg, sonst AutoEintrag u.Aktivierg d.gesicherten Bildungsfml.
'   Hinweis: Im AutoModus bleibt die Anzeige d.UDF Layers kurzzeitig erhalten, um d.lfd
'   BerechnReihflgNrn d.Werte (b.Interesse) sehen zu können - d.ZeitDauer kann auch per
'   benannter Konstante (defName lt naWZeit) in Xl angegeben wdn (alternat in StWZeit).
'   Achtung! AutoStapeln wird v.Calculate-Event ausgelöst u.erfolgt (ggf WZeit) sofort!
'   Vs1.1 -LSr -cd:20200930 -1pub:20201116h -lupd:20201005n
Sub BuildQStack(Optional QZBereich, Optional ByVal alsNLokNotat, Optional ByVal FmlAktivrg)
    Const StWZeit As Date = "00:00:03", naWZeit$ = "StapelWarteZeit", _
          mxKmstOr$ = "{*[""0-9][,;][""0-9]*}"
    Dim isComDel As Boolean, isFmReb As Boolean, isQxAuto As Boolean,  _
        isCalc As XlCalculation, wZeit As Date, adXZ$, adQZbFml$, mxKmstLok$, _
        Target As Range, xz As Range
    On Error GoTo fx
    With Application
        mxKmstLok$ = Replace(Replace(Replace(Replace(mxKmstOr, "{", _
                     .International(xlLeftBrace)), "}", .International(xlRightBrace)), ",", _
                     .International(xlColumnSeparator)), ";", .International(xlRowSeparator))
        isCalc = .Calculation: .Calculation = xlCalculationManual
        .EnableEvents = False: .ScreenUpdating = False
    End With
    isQxAuto = Not (dStap Is Nothing Or IsMissing(QZBereich))
    If Not IsMissing(FmlAktivrg) Then isFmReb = CBool(FmlAktivrg)
    If Not isQxAuto Then
        With ActiveWindow.RangeSelection.Cells(1)
            If .HasFormula And .HasArray Then
                Set Target = .CurrentArray
                adQZbFml = Target.Address(0, 0) & " " & Target.FormulaArray
                Target.Value = Target.Value
            ElseIf isFmReb Or .Value Like mxKmstLok Or .Value Like mxKmstOr Then
                Set Target = ActiveWindow.RangeSelection
            Else: Err.Raise xlErrRef
            End If
        End With
        If Not IsMissing(alsNLokNotat) Then isNonLocal = CBool(alsNLokNotat)
    Else: Set Target = QZBereich: On Error Resume Next
        If IsError(ActiveWorkbook.Names(naWZeit)) Then wZeit = StWZeit Else _
            wZeit = ActiveSheet.Evaluate(ActiveWorkbook.Names(naWZeit).Value)
        On Error GoTo fx: Application.Wait Now + wZeit
        adQZbFml = Target.Address(0, 0) & " " & Target.FormulaArray
        Target.ClearContents
    End If
    With Target.Cells(1)
        If Not .Comment Is Nothing Then
            With .Comment
                With .Shape.TextFrame
                    If isFmReb Then
                        adQZbFml = .Characters.Text
                        adQZbFml = Left(adQZbFml, InStr(adQZbFml, vbLf) - 1)
                        .Characters(1, Len(adQZbFml) + 1).Delete
                        Let isComDel = Len(.Characters.Text) = 0
                    Else: .Characters(1, 1).Insert (adQZbFml & vbLf & .Characters(1, 1).Text)
                    End If
                End With
                If isComDel Then .Delete
            End With
        ElseIf adQZbFml <> "" And Not isFmReb Then
            .AddComment (adQZbFml & vbLf)    'Anm: vbLf auch Fml-Ende-Marker!
        End If
        If adQZbFml <> "" And Not isFmReb Then
            With .Comment.Shape.TextFrame
                With .Characters(1, Len(adQZbFml)).Font
                    .Name = "Arial Narrow": .Size = 8: .Bold = False: .Italic = False
                End With
                .AutoSize = True
            End With
        End If
    End With
    If adQZbFml <> "" And isFmReb Then
        adXZ = Left(adQZbFml, InStr(adQZbFml, " ") - 1)
        adQZbFml = Mid(adQZbFml, Len(adXZ) + 2)
        With Range(adXZ)
            .ClearContents: .FormulaArray = adQZbFml
        End With
        GoTo ex
    End If
    For Each xz In Target
        If isQxAuto Then
            adXZ = xz.Address(0, 0)
            If dStap.Exists(adXZ) Then
                If Not isNonLocal Then
                    xz.FormulaLocal = "=" & dStap.Item(adXZ)
                Else: xz.Formula = "=" & dStap.Item(adXZ)
                End If
                dStap.Remove adXZ
            End If
        ElseIf Not isNonLocal Then
            xz.FormulaLocal = "=" & xz.Value
        Else: xz.Formula = "=" & xz.Value
        End If
    Next xz
    GoTo ex
fx: MsgBox Err.Description, vbCritical, "BuildQStack: F" & CStr(Err.Number)
    Set xz = Nothing
ex: Set Target = Nothing: isNonLocal = False
    If isQxAuto Then
        If dStap.Count = 0 Then Set dStap = Nothing
    End If
    With Application
        .Calculation = isCalc: .EnableEvents = True: .ScreenUpdating = True
    End With
End Sub
Unter dem VariablenNamen naWZeit wird der Name einer in Xl definierten benannten Konstante geführt (hier StapelWarteZeit), die so ggf auch anders benannt wdn kann, was dann natürlich auch im Pgm geändert wdn muss. Wurde eine solche Xl-Konstante nicht angelegt, wird stattdessen die PgmKonstante StWZeit benutzt, die auch auf 0 gesetzt wdn kann.
Luc :-?
Fortsetzung folgt!

Betrifft: Fortsetzung u.Schluss demnächst! owT
von: Luc:?
Geschrieben am: 21.11.2020 03:49:15

:-?

Betrifft: Voraussichtl Schlussbeitrag mit UDF Layers
von: Luc:?
Geschrieben am: 25.11.2020 02:21:12

Die bereits zu Anfang in Fmln gezeigte UDF Layers kann ja auf 3erlei Weise eingesetzt wdn:
1. Anzeige einer einzelnen Ebene, wobei alle Ebenen auch so zusammengesetzt wdn können, dass sich ein GesamtBild ergibt, dass im Falle des sog Kronecker-Produkts allerdings nicht der üblichen MatrixDarstellung desselben entspricht, sondern, wie bereits zuvor erwähnt, dem bei vertauschten FaktorMatrizen. Diese Darstellung wird dadurch erleichtert, dass man für die UDF-Argumente 2 u.3 die relative (Arg2) bzw absolute Adresse (Arg3) der 1.Zelle des wiederzugebenden EbenenGesamtBildes einträgt. Dadurch wird die Ebene bei Fml-Kopie im richtigen Abstand entsprd variiert. Bewegt man sich dabei rückwärts, also von rechts unten nach links oben, wird die Reihenfolge der einzelnen Ebenen umgekehrt. Für die 1.Ebene gilt hierbei nämlich stets Arg2 bezieht sich auf die gleiche Zelle wie Arg3. Dasselbe gilt dann naturgemäß auch für die letzte Ebene. Bezogen auf die QuellDaten im 1.Teil dieses INDEX-Beitrags können die pluralen Start- u/o Schluss-MatrixFmln dann so aussehen:
M110:O114[;P110:R114;M115:R129]: {=Layers(INDEX(WENNFEHLER(INDEX($A$2:$C$6;ZEILE($1:$5);SPALTE($A:$C))*INDEX($A$8:$B$11;;;1^$A$2:$C$6);0);;;1^$A$2:$C$6);M110;$M$110)}
M152:O156[;P152:R156;M157:R171]: {=Layers(INDEX(WENNFEHLER(INDEX($A$2:$C$6;ZEILE($1:$5);SPALTE($A:$C))*INDEX($A$8:$B$11;;;1^$A$2:$C$6);0);;;1^$A$2:$C$6);M152;$P$167)}
2. Es können auch alle Ergebnisse auf einmal zurückgegeben wdn, aber in Form von textlichen MatrixKonstanten über genausoviel Zellen bei gleicher Anordnung wie die 1.FaktorMatrix. Eine solche plurale MatrixFml sähe mit Layers für das Bsp in diesem INDEX-Teil so aus:
O68:Q72: {=Layers(INDEX(INDEX(M41:O45;ZEILE(1:5);SPALTE(A:C))*INDEX(M47:Q49;;;1^M41:O45);;;1^M41:O45);;;1)}
Hierbei wdn die TextForm-MatrixKonstanten in US-OriginalNotation angezeigt, was aber nur erforderlich ist, wenn sie per vbFkt Evaluate oder UDF TensEx in GesamtMatrizen gewandelt wdn sollen. Anderenfalls kann Arg4 ebenfalls entfallen.
3. Wird Argument5 WAHR oder ≠0 gesetzt, erfolgt die Bildung eines Qubix automatisch, wenn die bereits zuvor gezeigten SubProzeduren (inkl EreignisProzedur zum EinsatzBlatt) vorhanden sind. Dabei wird letztlich der MatrixVerbund aufgelöst, da die plurale MatrixFml entfernt wdn muss. Sie wird aber per Kommentar in der 1.Zelle des Qubix' bewahrt, so dass sie ggf zurückgeschrieben wdn kann.
Die nachfolgende UDF benötigt im VBE einen Verweis auf eine DLL, eine hier ebenfalls angegebene Enumeration und ggf die UDF VJoin in Versionen ab 1.4 (volle Leistung erst ab Version 1.5). Je nach Vorhandensein muss (ggf kann) die Konstante für die BedingtKompilierung eingestellt wdn. Standardmäßig ist #Const JoinTyp = 0 (ohne VJoin), bei Vorliegen von VJoin-Vs1.4 kann auf -1, ab Vs1.5 auf 1 gestellt wdn. Die Darstellung von Element-Matrizen ist nur ab Vs1.5 möglich, anderenfalls wdn Element-Vektoren verwendet, was für den Anwendungsfall Tabellen-Obfuskation auch ausreichend sein sollte.
Option Explicit

Public Enum cxTriState: cxAsUsed = -2: cxTrue: cxFalse: cxCTrue: End Enum

Rem Ptm#0: Unterstützg/Fixierg quasi 3-4dimensionaler DatenfeldMatrizen (3-4stufige Tensoren)
'   [Fmln m.xlFkt INDEX können im Ergebn uU 3-4dimens DFelder liefern, aber diese weder voll-
'   ständig indizieren noch abbild. Solche Daten können aber zwecks Auswertbark fixiert wdn.]
'   Arg1: spez INDEX-Fml, die ein 3/4d-Dfeld (Qubix) erzeugt; Arg2: Qubix-ZeilenTensorNr oder
'   linke obere Zelle d.akt ErgebBereichs (relativ) bzw entfällt; Arg3: Qubix-SpaltenTensorNr
'   linke ob Zelle d.PrimärErgebBereichs (absolut) bzw entfällt; Arg4: fehlt/0/FALSCH MxKonst
'   d.Ergebnisses wird in Lokal-, andfalls in US-OrigForm erzeugt; Arg5: fehlt/0/FALSCH Ergeb
'   wird nicht, sonst automat gestapelt (m.benöt Subproz BuildQStack per Ruf aus EreignProz).
'   Hwss: UDF zeigt im AutoStapelModus statt Ergebniss RhfolgNrn d.Berechn u.ZellAdressen an;
'   fehlen Argg2/3, wdn alle vorhd/erzeugten Daten zellweise in MxKonsttForm zusammengefasst,
'   wobei jede Zelle uU in willkürlicher Rhfolge einzeln berechnet wird (Effekt d.spez INDEX-
'   MxFml unter Xl), andfalls wird d.entsprd Qubix-Ebene wiedgegeben bzw aus d.ZellAngaben lt
'   Versatz Argg2:3 ermittelt, wobei ds auch rückwärts erfolg kann (in bd Argg2/3-Varianten).
'   Im Ggsatz zur UDF TensEx in akt Vs1.3, die zZ nur sowohl ALLE Matrizen als auch ALLE Ebe-
'   nen eines berechneten Qubix exten- bzw -pandieren kann, stellt Layers nur einzelne Ebenen
'   dar, deren Fmln so platziert wdn könn, dass sich 1e GesamtMatrix ergibt, die in Bezug auf
'   d.Kronecker-MxProdukt d.klass ErgebnisBild b.Vertauschen beider FaktorMatrizen entspricht
'   (seine Xl-AbbEbenen u.math TeilMatrizen stehen generell in diesem Vhältn zueinander). Die
'   1.FaktorMatrix bestimmt in Xl stets d.Größe d.ErgebnisBereichs u.damit d.Qubix-Ebenen, so
'   dass d.Abbild aller (Ergeb-)Werte (Argg2/3 entfall) so nur als MxKonstt fixiert mögl ist;
'   außerd kann d.UDF im Ggsatz zu TensEx d.Ebenen nur aus d.DirektErgeb d.BildFml ermitteln!
'   Mit UDF TensQubix lässt sich quasi umgekehrt 1e GesamtMatrix ebfalls in Qubix-Form bring.
'   Achtg! Benötigt Enum cxTriState, Dictionary (Vws auf Scripting Runtime) u.regul UDF VJoin
'   (#Const JoinTyp=-1/1 Vs1.4/Vss >1.4, =0 ohne VJoin bedingt kompiliert ->4d-Qubix nur b.1,
'   VJoin ab Vs1.5, möglich, sonst stets nur als 3d-Qubix angelegt); bedient 3 GlobVariablen.
'   Vs1.3 -LSr -cd:20200724 -1pub:nie -lupd:20201001n
Function Layers(Bezug, Optional ByVal ZTensOrAktEZelle, Optional ByVal STensOrPrimEZelle, _
                Optional ByVal nLokJoin As Boolean, Optional ByVal alsStapel As Boolean)
    #Const JoinTyp = 0
    Static dlZ As Long
    Dim cc As Long, cfc(1) As Long, cl(1) As Long, cx As Long, px As Long, _
        rc As Long, rfc(1) As Long, rl(1) As Long, rx As Long, isAll(1) As Boolean, _
        isQubix As cxTriState, adAZ$, mxCSep$(), mxLBrc$(), mxRBrc$(), mxRSep$(), _
        erg, xBez, xp, zwErg As Variant, wf As WorksheetFunction
    On Error Resume Next
    If IsError(LBound(Bezug, 2)) Then
        cc = UBound(Bezug) + 1 - LBound(Bezug): rc = 1
    Else: cc = UBound(Bezug, 2) + 1 - LBound(Bezug, 2)
          rc = UBound(Bezug, 1) + 1 - LBound(Bezug, 1)
    End If
    On Error GoTo fx: Set wf = WorksheetFunction
    If TypeOf Bezug Is Range Then Err.Raise xlErrRef
    With Application
        adAZ = .ThisCell.Address(0, 0)
        mxLBrc = Split(.International(xlLeftBrace) & " {")
        mxRBrc = Split(.International(xlRightBrace) & " }")
        mxCSep = Split(.International(xlColumnSeparator) & " ,")
        mxRSep = Split(.International(xlRowSeparator) & " ;")
    End With
    isQubix = CInt(IsMissing(ZTensOrAktEZelle)) Xor 2 * CInt(IsMissing(STensOrPrimEZelle))
    alsStapel = alsStapel And isQubix = cxFalse
    If alsStapel And dStap Is Nothing Then Set dStap = CreateObject("Scripting.Dictionary")
    On (isQubix + 3 Xor 7) Mod 4 GoTo av, ak, em
    If TypeOf ZTensOrAktEZelle Is Range And TypeOf STensOrPrimEZelle Is Range Then
        If alsStapel Then
            cl(1) = STensOrPrimEZelle.Columns.Count: rl(1) = ZTensOrAktEZelle.Rows.Count
            adQPZ = Cells(ZTensOrAktEZelle.Row, STensOrPrimEZelle.Column).Address(0, 0)
        Else: cfc(0) = STensOrPrimEZelle.Column: rfc(0) = STensOrPrimEZelle.Row
            cfc(1) = ZTensOrAktEZelle.Column: cl(0) = Abs(cfc(1) - cfc(0)) \ cc
            rfc(1) = ZTensOrAktEZelle.Row: rl(0) = Abs(rfc(1) - rfc(0)) \ rc
        End If
    ElseIf IsArray(ZTensOrAktEZelle) Or IsArray(STensOrPrimEZelle) Then
av:     If IsArray(STensOrPrimEZelle) Then
            If LBound(STensOrPrimEZelle) = UBound(STensOrPrimEZelle) Then
                STensOrPrimEZelle = STensOrPrimEZelle(UBound(STensOrPrimEZelle)): GoTo sn
            Else: On Error Resume Next
                If IsError(LBound(STensOrPrimEZelle, 2)) Then
                    cl(Abs(alsStapel)) = wf.Index(STensOrPrimEZelle, 1 - CInt(alsStapel))
                    If alsStapel Then cfc(1) = wf.Index(STensOrPrimEZelle, 1)
                Else: cl(Abs(alsStapel)) = wf.Index(STensOrPrimEZelle, 1 - CInt(alsStapel), 1)
                    If alsStapel Then cfc(1) = wf.Index(STensOrPrimEZelle, 1, 1)
                End If
                On Error GoTo fx
            End If
        Else
sn:         If IsNumeric(STensOrPrimEZelle) Then
                If alsStapel And CBool(InStr(STensOrPrimEZelle, " ")) Then
                    cl(1) = CLng(Split(STensOrPrimEZelle)(1))
                    cfc(1) = CLng(Split(STensOrPrimEZelle)(0))
                Else: cl(0) = STensOrPrimEZelle
                End If
            Else: Err.Raise xlErrNum
            End If
        End If
        On Abs(isQubix) GoTo ev
ak:     If IsArray(ZTensOrAktEZelle) Then
            If LBound(ZTensOrAktEZelle) = UBound(ZTensOrAktEZelle) Then
                ZTensOrAktEZelle = ZTensOrAktEZelle(UBound(ZTensOrAktEZelle)): GoTo zn
            Else: On Error Resume Next
                If IsError(LBound(ZTensOrAktEZelle, 2)) Then
                    rl(Abs(alsStapel)) = wf.Index(ZTensOrAktEZelle, 1 - CInt(alsStapel))
                    If alsStapel Then rfc(1) = wf.Index(ZTensOrAktEZelle, 1)
                Else: rl(Abs(alsStapel)) = wf.Index(ZTensOrAktEZelle, 1 - CInt(alsStapel), 1)
                    If alsStapel Then rfc(1) = wf.Index(ZTensOrAktEZelle, 1, 1)
                End If
                On Error GoTo fx
            End If
        Else
zn:         If IsNumeric(ZTensOrAktEZelle) Then
                If alsStapel And CBool(InStr(ZTensOrAktEZelle, " ")) Then
                    rl(1) = CLng(Split(ZTensOrAktEZelle)(1))
                    rfc(1) = CLng(Split(ZTensOrAktEZelle)(0))
                Else: rl(0) = ZTensOrAktEZelle
                End If
            Else: Err.Raise xlErrNum
            End If
        End If
        If alsStapel Then _
            adQPZ = Cells(rfc(1), cfc(1)).Address(0, 0): cfc(1) = 0: rfc(1) = 0
        On (2 + isQubix) Mod 2 + 1 + CInt(alsStapel) GoTo ek, ev
    ElseIf IsNumeric(ZTensOrAktEZelle) And IsNumeric(STensOrPrimEZelle) Then
        If alsStapel Then
            cl(1) = InStr(STensOrPrimEZelle, " ")
            rl(1) = InStr(ZTensOrAktEZelle, " ")
            If CBool(rl(1) * cl(1)) Then
                cl(1) = CLng(Split(STensOrPrimEZelle)(1))
                rl(1) = CLng(Split(ZTensOrAktEZelle)(1))
                adQPZ = Cells(CLng(Split(ZTensOrAktEZelle)(0)), _
                        CLng(Split(STensOrPrimEZelle)(0))).Address(0, 0)
            Else: Err.Raise xlErrRef
            End If
        Else: cl(0) = STensOrPrimEZelle: rl(0) = ZTensOrAktEZelle
ek:         Let isAll(0) = rl(0) = 0: rl(0) = rl(0) - Sgn(rl(0)) * rc ^ Abs(rl(0) < 0)
            If isQubix = cxFalse Then
ev:             Let isAll(1) = cl(0) = 0: cl(0) = cl(0) - Sgn(cl(0)) * cc ^ Abs(cl(0) < 0)
            End If
            If (cl(0) < 0 Or cl(0) >= cc Or rl(0) < 0 Or rl(0) >= rc) And _
                Not alsStapel Then Err.Raise xlErrNum
        End If
    Else: Err.Raise xlErrNum
    End If
    If isQubix = cxTrue Then
        ReDim sVk(cc - 1), sKv(rc - 1)
        For px = 0 To cc - 1: sVk(px) = sKv: Next px
    Else
em:     ReDim sVk(rc - 1), sKv(cc - 1)
        For px = 0 To rc - 1: sVk(px) = sKv: Next px
    End If
    zwErg = sVk
    For Each xBez In Bezug
        If Not IsEmpty(xBez) Then
            If isQubix = cxTrue Then zwErg(cx)(rx) = xBez Else zwErg(rx)(cx) = xBez
        End If
        rx = (rx + 1) Mod rc: cx = (cx - CInt(rx = 0)) Mod cc
    Next xBez
    If alsStapel Then isQubix = cxCTrue
    If isQubix = cxFalse Then
        erg = zwErg(rl(0))(cl(0))
    Else
        #If JoinTyp = 1 Then
            Select Case isQubix
            Case cxTrue:   If isAll(1) Then erg = VJoin(zwErg, mxRSep(Abs(nLokJoin)), cxMaxi) _
                           Else erg = VJoin(zwErg(cl(0)), mxRSep(Abs(nLokJoin)), cxMaxi)
            Case cxAsUsed: If isAll(0) Then erg = VJoin(zwErg, mxCSep(Abs(nLokJoin)), cxMaxi) _
                           Else erg = VJoin(zwErg(rl(0)), mxCSep(Abs(nLokJoin)), cxMaxi)
            Case cxCTrue:  If nLokJoin Then erg = VJoin(zwErg, "", cxMaxi) _
                           Else erg = VJoin(zwErg, , cxMaxi)
            End Select
        #ElseIf JoinTyp = -1 Then
            If isQubix = cxCTrue Then isQubix = cxAsUsed
            Select Case isQubix
            Case cxTrue:   If isAll(1) Then erg = mxLBrc(Abs(nLokJoin)) & VJoin(zwErg, _
                               mxRSep(Abs(nLokJoin)), -2) & mxRBrc(Abs(nLokJoin)) _
                           Else: erg = mxLBrc(Abs(nLokJoin)) & VJoin(zwErg(cl(0)), _
                                       mxRSep(Abs(nLokJoin)), -2) & mxRBrc(Abs(nLokJoin))
            Case cxAsUsed: If isAll(0) Then erg = mxLBrc(Abs(nLokJoin)) & VJoin(zwErg, _
                               mxCSep(Abs(nLokJoin)), -2) & mxRBrc(Abs(nLokJoin)) _
                           Else erg = mxLBrc(Abs(nLokJoin)) & VJoin(zwErg(rl(0)), _
                                      mxCSep(Abs(nLokJoin)), -2) & mxRBrc(Abs(nLokJoin))
            End Select
        #Else
            If isQubix = cxCTrue Then isQubix = cxAsUsed
            Select Case isQubix
            Case cxTrue:   erg = mxLBrc(Abs(nLokJoin)) & Join(zwErg(cl(0)), _
                                 mxRSep(Abs(nLokJoin))) & mxRBrc(Abs(nLokJoin))
            Case cxAsUsed: erg = mxLBrc(Abs(nLokJoin)) & Join(zwErg(rl(0)), _
                                 mxCSep(Abs(nLokJoin))) & mxRBrc(Abs(nLokJoin))
            End Select
        #End If
    End If
    If alsStapel Then
        If Not IsEmpty(erg) Then
            If dStap.Exists(adAZ) Then
                If dStap.Item(adAZ) <> erg Then dStap.Item(adAZ) = erg
            Else: dStap.Add adAZ, erg
            End If
            Layers = CStr(dlZ + 1) & "/" & dStap.Keys(dlZ)
        End If
        dlZ = (dlZ + 1) Mod (rl(1) * cl(1))
        If dlZ = 0 Then _
            isNonLocal = nLokJoin: adQPZ = Range(adQPZ).Resize(rl(1), cl(1)).Address(0, 0)
    Else: Layers = erg
    End If
    GoTo ex
fx: Layers = CVErr(Err.Number): Set dStap = Nothing: isQubix = vbFalse: isNonLocal = False
    erg = Empty: zwErg = Empty: dlZ = 0
ex: Set wf = Nothing
End Function
Ausblick Nutzungsmöglichkeiten:
Abgesehen mal davon, dass das Kronecker-Produkt in klassischer Anwendung eine Möglichkeit bieten könnte, komplexe SpeicherStrukturen zu vereinfachen, worauf ich bereits früher hingewiesen und verlinkt hatte, bestünde in Xl die Möglichkeit, komplexe Tabellen aufzubauen. Da das auf Grund der 2007 vorgenommenen Erweiterung eher kaum noch real erforderlich wäre, käme ggf aber eine Archivierungskomprimierung infrage. Auf der anderen Seite bieten sich so Möglichkeiten, Tabellen unabhängig von gängigen Verschlüsselungsmethoden, ggf auch zusätzlich, zu obfuszieren, d.h. konkret, die echten Daten in einem Stapel erfundener Daten zu verstecken. Das könnte man wohl auch automatisieren und dabei einen Positionscode für die Echtdaten mitschreiben bzw vorgeben, der dem DatenErzeuger und ihrem rechtmäßigen Verwender natürlich bekannt sein muss, aber sonst niemandem. Ich habe es noch nicht ausprobiert, aber evtl kann man die für jedes Element der 1.FaktorMatrix des Kronecker-Produkts wiederholte 2.FaktorMatrix bei jeder Wiederholung etwas anders modifizieren, so dass auch die Bildung der BlindDaten automatisierbar wäre.
Nutzungshinweis:
Meine im Rahmen dieses und anderer Foren veröffentlichten VBA-Prozeduren stehen nach den Regeln des jeweiligen Forums zur Nachnutzung wie geschrieben frei. Nicht erwünscht ist ihre Umbenennung, jedwede Veränderungen außer den vorgesehenen und Anpassungen an spezielle EinsatzFälle. Das ist vor allem bei den UDFs, die mit originären Xl-Fktt weitgehendst zusammenarbeiten können, auch nicht erforderlich. Nicht nur eine Frage der Fairness ist es, die ggf vorangestellten Anmerkungen nicht zu löschen bzw die Zeile mit Versions- u.UrheberVermerk nicht zu entfernen. Keine Einwände wdn gegen die bsphafte Nutzung von PgmTeilen für andere Zwecke erhoben, sofern dafür nicht der gleiche Name verwendet wird. Dann ist natürlich auch erlaubt, dass der jeweilige GesamtAutor seinen eigenen Namen verwendet. Ein Hinweis auf die ursprüngliche Quelle wäre nett, ist aber nicht unbedingt erforderlich (außer bei KomplettÜbernahmen mit nur geringfügigen Änderungen).
Wdn Fehler in den PgmAbläufen konstatiert, die nicht aus falscher Nutzung resultieren, können mir diese im Forum mitgeteilt wdn. Gleiches gilt für evtl Nachfragen. Für ggf durch Nutzung der Prozeduren entstandene Schäden haften weder Autor noch Forumsbetreiber. Meist dürften diese ja auch auf falscher Anwendung beruhen.

Viel Erfolg! Luc :-?

Betrifft: Übrigens noch was, ...
von: Luc:?
Geschrieben am: 29.11.2020 00:08:50

…das Wörtchen nie in der letzten Vorbemerkungszeile der UDF darf/sollte durchaus durch das Publikationsdatum 20201125h (h wie herber) ersetzt wdn. Das hatte ich leider vergessen. ;-)
Luc :-?

Betrifft: AW: gelesen ...
von: neopa C
Geschrieben am: 30.11.2020 10:39:28

Hallo Luc,

... oder korrekter geschrieben "überflogen" hab ich Deine letzten Beiträge hier im thread schon.
Aber ab Deinem Beitrag vom 6.11. konnte ich Deinen Ausführungen nicht mehr wirklich richtig folgen, weil es mir zu theoretisch war und ich in der Thematik für mich persönlich noch keinen Nutzeffekt erkennen konnte. Was natürlich keine Abwertung Deiner aufgezeigten Leistung darstellt. Mein Horizont ist viel zu niedrig, um Dein hier aufgezeigtes einer angemessenen Kritik zu unterziehen.

Gruß Werner
.. , - ...

Betrifft: Bitte den Horizont nicht tiefer legen, ...
von: Luc:?
Geschrieben am: 05.12.2020 02:12:21

…Werner,
denn „…viel zu niedrig…“ ist der Deine sicher nicht. Nur setzt Du mehr auf Pragmatismus, während mich vor allem die eher verborgene Xl-Leistungsfähigkeit interessiert. Und damit meine ich vor allem, was die Xl-Rechenmaschine zu leisten vermag, auch ohne dass Xl zB für das Kronecker-Produkt eine spezielle Fkt mitbringt wie sie bspw in MatLab enthalten sein soll (heißt dort wohl Kron). Eine Anwendung seiner klassischen Form wurde schon vor einigen Jahren für die Bildung flacher 2d-SpeicherStrukturen vorgeschlagen, die weniger Platz benötigen als n-dimensionale. Das setzt natürlich einiges mehr voraus. Aber auch auf dem TabBlatt kann das hier Vorgestellte uU nützlich sein, wenn auch eher in SpezialFällen. Aber wer weiß, ob das nicht jemand mal gebrauchen kann… Zumindest die Bildungsfml für dieses Produkt, wenn alle ErgebnisWerte stets sichtbar sein sollen, lässt sich so vereinfachen. Und die neue MxFml-Form-Ersatz- und -Expansionsautomatik wird hierbei auch nicht anders wirksam, d.h., sie bildet auch nicht alle ErgebnisWerte ab (hatte ich testen lassen).
Gruß, Luc :-?
PS: Will Dir auch noch mal 'ne Mail senden, war bisher aber noch nicht dazu gekommen.