Hallo!
Die Überschrift ist leider etwas undeutlich.
Ich habe 2 Matritzen, welche allerdings nicht in einem zweidimensionalen
Array gespeichert sind, sondern jeweils in der Form (a1,a2,a3,a4,a5,
b1,b2,b3,b4,b5, c1,...) in einem eindimensionalen Array.
Ich bin nun auf der Suche nach einem Multiplikationsalgorithmus, bei dem
ich aber nicht den Vektor vorher in eine Matrix umwandeln muss um eine
"normale" Matritzenmultiplikation (nach dem Standartschma) zu
implementieren.
Kennt jemand eine Lösung?
Markus wrote:
> ich aber nicht den Vektor vorher in eine Matrix umwandeln muss um eine> "normale" Matritzenmultiplikation (nach dem Standartschma) zu> implementieren.
D.h. im Klartext du willst nicht das 1D-Array in ein 2D Array
umpfriemeln.
> Kennt jemand eine Lösung?
Auch ein 2D Array ist doch letztendlich auch nur eine Rechenvorschrift,
wie man die Koordinaten als Offset zum Beginn der Daten umrechnen muss.
Mehr steckt da nicht dahinter.
Und sowas kannst du auch selber machen. Du weisst ja wieviele Zeilen
bzw. Spalten es gibt.
In deinem Fall muss berechnet werden
(Kleinbuchstaben kennzeichnen die eine Matrix,
Grossbuchstaben die andere
Die Werte für die Ergebnismatrix beginnen mit Erg
Erg_a1 = a1 * A1 +
a2 * B1 +
a3 * C1 +
a4 * D1 +
a5 * E1;
Erg_a2 = a1 * A2 +
a2 * B2 +
a3 * C2 +
a4 * D2 +
a5 * E2;
....
Erg_b1 = b1 * A1 +
b2 * B1 +
b3 * C1 +
b4 * D1 +
b5 * E1;
Erg_b2 = .....
Und jetzt setzt du dich hin, studierst das Muster wer mit wem
multipliziert wird und schaust dir an mit welcher allgemeinen Formel man
diese Werte in dem 1D Array aufsuchen kann.
Es hilft auch, wenn du dir den 1D Vektor mal aufschreibst und mit den
jeweiligen Zeigefingern (rechte Hand, linke Hand) die Werte für die
Einzelmultiplikationen eines Ergebniswertes aufsuchst. Dann erkennst du
nämlich sehr schnell, dass da eine sehr einfache Gesetzmässigkeit
dahintersteckt.
Du schreibst den Algorithmus wie in 2D hin, nur dass bei jedem Zugriff
auf Matrixelemente vorher die entsprechende Adressrechnung durchgeführt
wird:
Arrayindex = Zeilenindex * Zeilenlänge + Spaltenindex
(wobei die Zeilen- und Spaltenindices ab 0 zählen, genau wie im
2D-Fall). Diesen Arrayindex benutzt du dann für den Array-Zugriff,
sowohl beim Lesen der Eingabematrizen als auch beim Schreiben der
Ausgabematrix.
@schneehase:
Mit den Zeigern in C kenne ich mich nicht so aus.
Danke!
Wie geht eigendlich der umgekehrte Weg, also ein zweidimensionales Array
in ein eindimensionales verwandeln?
Markus wrote:
> @schneehase:> Mit den Zeigern in C kenne ich mich nicht so aus.> Danke!> Wie geht eigendlich der umgekehrte Weg, also ein zweidimensionales Array> in ein eindimensionales verwandeln?
Psst. Ich verrat dir was:
Es gibt kar keine 2D-Arrays.
Bei einem Array liegen alle Bytes die es ausmachen immer im Speicher
hintereinander, egal ob 1D, 2D, n-D
Ob das dann als 1D oder 2D oder 3D aufgefasst wird, hängt einzig und
alleine davon ab, wie die Umrechnung von den angegebenen Indizes zu der
Bytenummer ab Beginn des Arrays gemacht wird, ist also eine reine
Berechnungssache beim Zugriff.
Und der Tip Nummer 2:
Mit einem Cast, kannst du den Compiler immer zwingen, irgendwelche Bytes
im Speicher als genau den von dir gewünschten Datentyp aufzufassen.
Das hier ist zb ein 2D Array mit den Dimensionen 5 und 3.
Die Zahlen in den Feldern geben die Indexnummer jedes ELements an, wenn
man einfach alle Elemente hintereinander anordnen würde.
+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 |
+---+---+---+---+---+
| 5 | 6 | 7 | 8 | 9 |
+---+---+---+---+---+
|10 |11 |12 |13 |14 |
+---+---+---+---+---+
Im Speicher liegt das dann so vor
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |11 |12 |13 |14 |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
also einfach nur alles hintereinander.
Zurück zur 2D Sicht der Dinge. Um also an das erste Elemnt in der
zweiten Zeile zu kommen, musst du praktisch gesehen, einfach nur alle
Elemente der ersten Zeile 'überspringen'. Wieviele das sind weist du
aber: Das gibt dir die Spalten Dimension ja vor.
Arrayindex = Zeilenindex * Anzahl_Spalten + Spaltenindex