Laden...

Wie mache ich aus zwei Arrays ein multidimensionales Array?

Erstellt von aloqqq vor 3 Jahren Letzter Beitrag vor 3 Jahren 367 Views
A
aloqqq Themenstarter:in
1 Beiträge seit 2020
vor 3 Jahren
Wie mache ich aus zwei Arrays ein multidimensionales Array?

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

T
2.219 Beiträge seit 2008
vor 3 Jahren

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.

6.911 Beiträge seit 2009
vor 3 Jahren

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!"