Array-Dimensionierung - Beispiel
25.02.2012 07:45:22
Erich
Hi Dennis,
es gibt nicht nur nullbasierte oder einsbasierte Arrays. Die Basis kann jede ganze Zahl sein - auch eine negative.
(Bei negativen Indizes könnte man z. B. daran denken, die 0 für das aktuelle Jahr, -1 und -2 für die beiden Vorjahre,
1, 2, 3 für die drei Folgejahre zu nehmen.)
Mit der Matrizenmultiplikation hat das nichts zu tun. Bei Verwendung unterschiedlich basierter Matrizen
wird allenfalls der Umgang mit den Indizes etwas interessanter.
Es kommt allein darauf an, wie viele Zeilen/Spalten die Matrizen haben, also nicht die genauen Nummern,
sondern nur die Anzahl Zeilen und Spalten ist wichtig.
Ich habe mal eine kleine Mappe gebaut, in der eine Matrix arrA (einsbasiert) vom Tabellenblatt eingelesen wird,
die zweite Matrix arrB wird im Makro direkt gefüllt und auf dem Blatt ausgegeben.
Dann werden im Makro die beiden Matrizen multipliziert und das Produkt arrC auch in das Blatt geschrieben.
Zusätzlich werden im Blatt noch die beiden Blatt-Matrizen arrB und arrA per MMULT miteinander multipliziert.
Das Ergebnis sollte natürlich gleich dem VBA-Ergebnis sein. :-) Tipp: Excelhilfe zur Fkt. MMULT lesen.
Das Spannende an den Matrizen arrB und arrC: Sie sind weder null- noch einsbasiert, sondern irgendwie.
Und man kann sie auch in VBA multiplizieren...
Hier die Mappe: https://www.herber.de/bbs/user/79091.xls
Da ich selbst oft nicht mag, wenn man erst mal eine Mappe laden muss, um eine Aufgabe zu verstehen zu können,
hier der Code:
Sub MatrixMult()
Dim arrA, arrB(3 To 7, 100 To 102), arrC()
Dim zz As Long, ss As Long, ii As Long
' ------------------------------------------------- Matrix A einlesen
arrA = Cells(2, 3).Resize(3, 6) ' einsbasiert (1 to 3, 1 to 6)
' ------------------------------------------------- Matrix B rechnen
For zz = 3 To 7
For ss = 100 To 102
arrB(zz, ss) = 3 * zz + ss - 107
Next ss
Next zz
Cells(6, 2).Resize(5, 3) = arrB ' Ausgabe der Matrix B
' ------------------------------------------------- Produkt der Matrizen
' arrC: =MMULT(arrB;ArrA)
ReDim arrC(7 To 11, -2 To 3)
For zz = 7 To 11
For ss = -2 To 3
For ii = 1 To 3
arrC(zz, ss) = arrC(zz, ss) + arrB(zz - 4, ii + 99) * arrA(ii, ss + 3)
Next ii
Next ss
Next zz
' Ausgabe der Matrix C
Cells(13, 6).Resize(UBound(arrC, 1) - LBound(arrC, 1) + 1, _
UBound(arrC, 2) - LBound(arrC, 2) + 1) = arrC
End Sub
und die Tabelle (ohne Formel):
| B | C | D | E | F | G | H | I | J | K | L | M |
2 | | 1 | 2 | 3 | 4 | 5 | 6 | | | | | |
3 | | 11 | 12 | 13 | 14 | 15 | 16 | | arrA | | | |
4 | | 21 | 22 | 23 | 24 | 25 | 26 | | | | | |
5 | | | | | | | | | | | | |
6 | 2 | 3 | 4 | | | | | | | | | |
7 | 5 | 6 | 7 | | 119 | 128 | 137 | 146 | 155 | 164 | | |
8 | 8 | 9 | 10 | | 218 | 236 | 254 | 272 | 290 | 308 | | |
9 | 11 | 12 | 13 | | 317 | 344 | 371 | 398 | 425 | 452 | | MMULT |
10 | 14 | 15 | 16 | | 416 | 452 | 488 | 524 | 560 | 596 | | |
11 | | | | | 515 | 560 | 605 | 650 | 695 | 740 | | |
12 | | arrB | | | | | | | | | | |
13 | | | | | 119 | 128 | 137 | 146 | 155 | 164 | | |
14 | | | | | 218 | 236 | 254 | 272 | 290 | 308 | | |
15 | | | | | 317 | 344 | 371 | 398 | 425 | 452 | | arrC |
16 | | | | | 416 | 452 | 488 | 524 | 560 | 596 | | |
17 | | | | | 515 | 560 | 605 | 650 | 695 | 740 | | |
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich