Matlab-array von struct : Schnelle Zuordnung
Gibt es eine Möglichkeit, um "Vektor" weisen Sie ein array von struct.
Derzeit kann ich
edges(1000000) = struct('weight',1.0); //This really does not assign the value, I checked on 2009A.
for i=1:1000000; edges(i).weight=1.0; end;
Aber das ist langsam, ich will etwas mehr wie
edges(:).weight=[rand(1000000,1)]; //with or without the square brackets.
Irgendwelche Ideen/Vorschläge zu Vektorisieren diese Abtretung an, so dass es schneller sein wird.
Vielen Dank im Voraus.
dieser Beitrag könnte helfen: stackoverflow.com/questions/4166438/...
InformationsquelleAutor sumodds | 2011-10-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie versuchen, mit der Matlab-Funktion
Angebot
, aber ich fand es benötigt, um zu zwicken, der Eingang ein wenig (mit dieser Frage: In Matlab für ein multiple-input-Funktion, wie man mit einem einzigen Eingang mehrere Eingänge?), dann gibt es vielleicht etwas einfacher.Außerdem fand ich, dass dies nicht annähernd so schnell, wie die for-Schleife auf meinem computer (~0.35 s zum deal versus ~0.05 s für die Schleife), vermutlich weil der Aufruf
mat2cell
. Der Unterschied in der Geschwindigkeit reduziert, wenn Sie mehr als einmal, aber es bleibt zu Gunsten der for-Schleife.Dies sind meine Zeiten. Auf Octave : .17s für 100K und 1.57 s für 1mil, für diese Methode, und es dauert für immer, wenn ich eine for-Schleife, wie 230s für 100K. MATLAB 2009B (diff-Maschine/OS): 5s/49s mit den oben und .22s/2.2 s mit for-Schleife.
InformationsquelleAutor Aabaz
Dies ist viel schneller als das Angebot, oder eine Schleife (zumindest auf meinem system):
Verwendung von geschweiften Klammern auf der rechten Seite gibt eine durch Kommata getrennte Liste aller Werte in W (d.h. N Ausgänge) und mit eckigen Klammern auf der rechten Seite weist die N Ausgänge der N-Werte im edge(:).Gewicht.
varargout
in exakt der gleichen Weise, dassdeal()
tut, haha.Hoppla, fand ich, war mit
mat2cell()
stattnum2cell()
. Hier ist die Funktion:cellexpand()
.Sie können der anonymen Griffe:
cellexpand = @(x) x{:}; numexpand = @(x) cellexpand(num2cell(x));
. Ein Beispiel:[a, b] = numexpand([1, 2]);
. Konkreter:[edge.weight] = numexpand([edge.weight] + 50);
InformationsquelleAutor Alistair
Könnte man einfach schreiben:
InformationsquelleAutor Amro
Gibt es etwas, dass Sie besonders verwenden Sie eine Struktur in dieser Art und Weise?
Betrachten Sie ersetzen Ihre array von structs mit einfach eine separate Arrays für jedes Element der struct.
Wenn Sie eine struct-member, das ist ein array, können Sie eine zusätzliche dimension:
Wenn Sie wollen, nur halten die Dinge ordentlich, könnte man diese arrays in einem struct:
Aber wenn Sie benötigen, um ein array von structs, ich denke, man kann
Trotzdem danke. 🙂
Der Unterschied ist, dass Sie in Matlab ein array von Strukturen ("struct-organisiert") ist höchst ineffizient, da jede Struktur speichert jedes der Felder in einem separaten array, so dass Sie nicht tun können, vektorisierte Operationen auf Ihnen. Ein struct-arrays ("planar-organisiert"), wie Brians speichert jedes der Felder in der primitiven arrays, die im Speicher zusammenhängend sind, und vektorisiert (fast) Matlab-Funktionen werden in der Arbeit auf. Es ist eine viel bessere Struktur für Matlab, und weitere Redewendungen.
InformationsquelleAutor Brian L
Dem Grund, dass die Strukturen in deinem Beispiel bekomme nicht ordnungsgemäß initialisiert ist, dass die syntax, die Sie verwenden nur Adressen, die dem letzten element im struct-array. Für einen nicht vorhandenen array, der rest von Ihnen implizit gefüllt mit Strukturen, die die Standard-Wert
[]
in allen Ihren Bereichen.Um dieses Verhalten zu deaktivieren, versuchen Sie einen kurzen array mit
clear edges; edges(1:3) = struct('weight',1.0)
und sucht bei jedem deredges(1)
,edges(2)
, undedges(3)
. Dieedges(3)
element hat1.0
in seinem Gewicht, wie Sie wollen; die anderen haben[]
.Die syntax für die effiziente Initialisierung ein array von structs ist eine von diesen.
Hinweis: die
1:1000
statt nur1000
bei der Indizierung in den nicht initialisierten Kanten-array.Dass es ein problem mit der
edges(1:1000)
form: wennedges
bereits initialisiert wurde, wird diese syntax nur die Aktualisierung der Werte der ausgewählten Elemente. Wenn die Kanten mehr als 1000 Elemente, die anderen werden unverändert übernommen, und Ihr code fehlerhaft. Oder wennedges
ist eine andere Art, Sie konnten sich ein Fehler oder seltsamen Verhalten je nach vorhandenen Datentyp. Um sicher zu sein, müssen Sieclear edges
vor dem initialisieren mit der Indizierung syntax. So ist es besser, nur das zu tun, vollen Einsatz mit denrepmat
form.ABER: Unabhängig davon, wie Sie initialisiert wurde, wird ein array von structs wie dieses ist immer inhärent langsam, mit zu arbeiten für größere Datenmengen. Sie können nicht real "vektorisiert" - Operationen, weil Ihre primitiven arrays sind alle gebrochen zu trennen mxArrays innerhalb jedes struct-element. Enthält das Feld Zuordnung in deiner Frage – ist es nicht möglich zu Vektorisieren. Stattdessen sollten Sie Schalter einer struct-arrays wie Brian L s Antwort vorschlägt.
InformationsquelleAutor Andrew Janke
Können Sie einen reverse-struct und dann alle Vorgänge ohne Fehler
wie diese
und dann wird der Vorgang wie folgt
oder so
oder vielleicht
Es ist wirklich schneller als for_loop und Sie brauchen nicht, andere große Funktionen, um langsam Ihr Programm.
InformationsquelleAutor Mosa Hasan