Wie bewahren Sie diese Struktur (Liste von Listen von Integer-zahlen) in Matlab?
Brauche ich zum speichern einer Liste von Listen von Integer-zahlen. Zum Beispiel X[1]
sollte in der Lage sein zu enthalten [1 3 5]
während X[2]
enthalten könnte [1 2]
. Was ist die beste Lösung? Ein cell-array?
Back story:
Für ein Projekt, ich pre-Berechnung der Schnittpunkte zwischen N Zeilen und M Würfel. Diese werden wieder in zwei Arten: eine Linie index, ich möchte eine Liste der cubes, die es durchläuft, und da ein cube-index, ich möchte eine Liste von Linien, die Sie passieren.
Typische Werte sind N=2^24 und M=2^18, was bedeutet, dass ein Kreuzungspunkt-matrix (NxM) ist aus der Frage. Glücklicherweise ist die Durchschnittliche Linie überschreitet nur durch M^(1/3)=2^6 Würfel. Derzeit bin ich der Speicherung der Struktur als eine NxM^(1/3) - matrix, so dass X(n,:)
ist ein Vektor, der Würfel, die der N-TEN Zeile durchläuft (mit Nullen aufgefüllt).
Dies funktioniert gut für das abrufen von cubes aus einer Liste einen index, aber es stellt sich heraus, dass der Engpass von meinem code ist das abrufen von Zeilen in einem gegebenen Würfel den index. (Ich mache es mit find(X==m)
wo m ist die cube-index.) Ich kann nicht das Gegenteil matrix, als die Anzahl der Zeilen, die durch einen einzelnen cube kann sehr hoch sein, obwohl es im Durchschnitt niedrig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel eine cell array ist die richtige Antwort für diese. Dies ist der einfachste Fall. Einige beispielverwendungen:
Es ist jedoch nicht die einzige Antwort.
Man könnte eine array von Strukturen, die jeweils mit einem Feld namens
.indexes
(oder einem entsprechenden Namen basierend auf Ihrem problem). Dies ermöglicht ein wenig mehr Flexibilität, wenn es zusätzliche Informationen, die Sie möchte an Ihrer Liste von Listen, zum Beispiel cube-position Hinzugefügt werden könnten, als.position
Feld. Beispiel Verwendungen:Können Sie auch ein Container.Karte Objekt. Dieser hat die gleichen Vorteile wie ein array von Strukturen, aber mit mehr Flexibilität in, wie Sie Ihre Referenz-Objekte. In der Erwägung, dass bei der Verwendung eines array von Strukturen eine Struktur ist, verweist durch einen index, mit einem Behälter.Map-Objekt referenzieren kann jede Struktur mit einer beliebigen Anzahl (nicht-Ganzzahlen in der Nähe von 1) oder ein name (nicht praktikabel für 2^24 Fälle). Dies ist wahrscheinlich nicht die beste Antwort für Sie, aber für die Referenz-Beispiele verwendet werden, sind unten:
Schließlich, kann es sich lohnen, definieren ein paar von benutzerdefinierte Klassen für diese. Dies ist etwas mehr Arbeit, aber ist wahrscheinlich der einfachste Weg, um Konstante Zeit Suchvorgänge in Ihren vorberechneten Werte. Einige code, um Ihnen den Einstieg auf diesem Weg ist unten.
So verwenden Sie diese Klassen, wie geschrieben, Sie müssen rufen Sie die
add
Methoden in Paaren (eine offensichtliche upgrade für später ist es richtig Kreuz hinzufügen. In der Zwischenzeit (da ich faul bin), definieren wir eine Hilfsfunktion.Nun Beispiel ist:
BTW, wir sind wirklich nur unter advanatge der Tatsache, dass
< handle
Klassen Verhalten sich wie pass-by-reference, also können wir komplexe, cross-linked-data-Strukturen.