Wie mache ich aus zwei Arrays ein multidimensionales Array,
explizites Bsp.:
(1) (6)
(2) (6)
(3) (4)
(4), (9)
zu
(1 6)
(2 6)
(3 4)
(4 9)
beziehungsweise als Liste: (1,2,3,4) und (6,6,4,9) zu (1,6,2,6,3,4,4,9)
Danke
Sollte eigentlich einfach sein.
Wenn du sicherstellst, dass beide Listen/arrays gleich groß sind, ist das von der Programmierung her doch simpel.
1.Elemente in for Schleife durch laufen.
2.Zähler der SChleife als Index für die erste Dimension der Matrix nutzen.
3.Aktuelles Element aus der ersten Liste in die erste Posistion der aktuellen Dimension schreiben
3.Aktuelles Element aus der zweiten Liste in die zweite Posistion der aktuellen Dimension schreiben
Liese sich vermutlich mit 5 Zeilen mit einer for Schleife umsetzen.
Die Matrix muss in der ersten Dimension = Anzahl Elemente der Listen haben und als zweite Dimension dann fix 2 in der zweiten Dimension die beiden Zahlen hast.
Code kannst du gerne selbst mal versuchen.
Die Doku kann dir auch helfen bei den Arrays:
Doku Arrays
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
Hallo aloqqq,
multidimensionales Array
Muss es ein multidimensionales Array sein?
"Jagged arrays" werden von der .NET Runtime besser unterstützt, falls Leistung ein Kriterium ist.
Auch bieten die jagged Arrays die Möglichkeit die Matrix als Tupel von Spaltenvektoren zu speichern -- du hast das Layout in der Hand. Für dein Beispiel wäre es dann einfach den Vektor in die jeweilige Spalte zu kopieren.
int[] col0 = { 1, 2, 3, 4 };
int[] col1 = { 5, 6, 7, 8 };
int[][] matrix = new int[2][];
matrix[0] = new int[col0.Length];
matrix[1] = new int[col1.Length];
col0.CopyTo(matrix[0], 0);
col0.CopyTo(matrix[1], 0);
Es ist auch möglich die Matrix nur in einem (1d) Array zu speichern, so dass einfach Spaltenvektor and Spaltenvektor gehängt wird. Der Zugriff erfolgt dann via entsprechenden Indexer. Grob z.B. so
using System;
int[] col0 = { 1, 2, 3, 4 };
int[] col1 = { 5, 6, 7, 8 };
Matrix matrix = new(4, 2);
matrix.SetColumnVector(col0, 0);
matrix.SetColumnVector(col1, 1);
matrix.Print();
public class Matrix
{
private readonly int[] _storage;
private readonly int _rows;
private readonly int _cols;
public Matrix(int rows, int cols)
{
// Argumente sollten hier validiert werden, auch ist auf potentiellen Overflow
// (durch die Multiplikation) zu achten!
int size = rows * cols;
_storage = new int[size];
_rows = rows;
_cols = cols;
}
// Wir verwenden ein "ref return", es wird also die Referenz zum Matrix-Element
// zurückgegeben. Das erspart uns die Implementierung eines "setters".
public ref int this[int i, int j]
{
get
{
if (i >= _rows) throw new ArgumentOutOfRangeException(nameof(i));
if (j >= _cols) throw new ArgumentOutOfRangeException(nameof(j));
// Matrix wird spaltenweise (als Tupel von Spaltenvektoren)
// gespeichert
int index = j * _rows + i;
return ref _storage[index];
}
}
public void SetColumnVector(int[] vector, int j)
{
if (vector.Length != _rows) throw new ArgumentException(/* ... */);
int index = j * _rows;
Array.Copy(vector, 0, _storage, index, vector.Length);
}
public void Print()
{
for (int i = 0; i < _rows; ++i)
{
for (int j = 0; j < _cols; ++j)
{
Console.Write($"{this[i, j]}\t");
}
Console.WriteLine();
}
}
}
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"