Wie initialisiert man ein Array von Strukturen in MATLAB?
Wie kann ich preallocate ein array von structs in MATLAB? Ich möchte preallocate "a" in diesem Beispiel, so dass es nicht die Größe mehrmals.
a = []
for i = 1:100
a(i).x = i;
end
InformationsquelleAutor der Frage Mohammad Moghimi | 2012-12-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit
repmat
ist bei weitem der effizienteste Weg, um preallocate Strukturen :Dies ist ~10x schneller mit Matlab 2011a, als preallocating über die Indizierung, wie in
Indexing-Methode ist nur geringfügig schneller als nicht preallocating.
Folgenden Code in Fall, dass Sie überprüfen möchten.
P. S. ich wäre daran interessiert zu wissen, warum dies wahr ist, wenn jemand kann es erklären.
InformationsquelleAutor der Antwort jerad
Gibt es eine nette Diskussion über diese in Loren auf die Kunst des MATLAB blog.
Wenn ich Sie richtig verstehe, ist hier eine Weise, die zum initialisieren der struct Sie wollen:
Mit dieser Methode können wir sehen, dass Elemente sind gefüllt mit leeren arrays.
InformationsquelleAutor der Antwort bla
Gibt es eine Reihe von Möglichkeiten, wie Sie können initialisieren einer Struktur. Zum Beispiel, können Sie die
struct
Befehl:setzt alle Felder
x
zu leeren.Können Sie auch
deal
zu erstellen und füllen Sie die Struktur, wenn Sie wissen, welche Daten gehen sollte esOder verwenden Sie
struct
wieder (beachten Sie, dass, wenn ein Feld der Struktur sollte ein cell-array, die Zelle muss in geschweifte Klammern eingeschlossen werden!)InformationsquelleAutor der Antwort Jonas
Die Art und Weise dies gemacht werden soll, und die einfachste ist
Wenn Sie beheben die fehlende "tic" und fügen Sie diese Methode, um die benchmarking-code präsentiert von jerad, die Methode, die ich vorschlagen, oben ist ein bisschen langsamer als repmat aber viel einfacher zu implementieren, hier ist die Ausgabe:
Dem Grund, dass repmat schneller ist, da ein Wert zu jedem x' - Feld zugeordnet ist, während der pre-allocation, statt es leer zu lassen. Wenn die oben genannten pre-allocation-Technik geändert wird, so beginnen wir mit aller der x-Felder, die einen Wert () zugewiesen, wie folgt:
Dann das benchmarking verbessert sehr, sehr nahe gewesen, oder einige Zeit schneller als repmat. Der Unterschied ist so klein, dass jedes mal, wenn ich es laufen lasse ändert es das man schneller ist. Hier ein ergebnisbeispiel:
Umgekehrt, wenn die repmat pre-Zuweisung geändert wird, setzen Sie das Feld leer, wie diese
Alle speed-Vorteil verloren
InformationsquelleAutor der Antwort Camilo Rada
Laut diese Antwort, es gibt auch einen anderen Weg, es zu tun:
wo
val
ist der Wert, den Sie zuweisen möchten jeder element der struct.Den Effekt dieses Befehls unterscheidet sich von derjenigen der anderen, wie jeder
x
Feld jeder Struktura
zugewiesen werden, dieval
Wert.InformationsquelleAutor der Antwort Alessandro Cuttin
Anstatt von pre-Zuweisung das array von structs kann es einfacher sein, um die Rückseite der Schleife. Auf diese Weise wird das array zugewiesen, der in der ersten iteration und den rest der Iterationen verwendet werden, die zum füllen der Strukturen.
InformationsquelleAutor der Antwort Jasper Uijlings