Verfasst am: 13.08.2010, 13:07
Titel: Wie Cell-Array initialisieren zwecks Geschw.-Optimierung
Hallo zusammen,
ich hab hier meine tausende von Files aus denen ich immer nur einen gewissen Bereich einlesen möchte. Mittlerweile klappt das auch alles wunderbar, nur dauert es eine kleine Ewigkeit. Ich hab jetzt schon mehrmals gelesen das ich mir vorher qausi schon das Array erstellen soll und das dann mit Nullen fülle, die ich dann später überschreibe. Mir ist jetzt leider nicht ganz klar, wie ich das auf mein Konstrukt anwenden muss. Könnte mir da vielleicht einer von Euch weiterhelfen?
for i = n:m
dewidata.(sprintf('file_%d',i )) = dlmread(file(i).name, ';', 761, 0);
end
tmp= tmp_length - m;
ifexist('Datafile.mat','file');
save('Datafile', 'dewidata', '-append');
else save Datafile dewidata;
end;
n = n + 10;
m = m + 10;
tmp_length = tmp;
end for i = n:length(file) %m
dewidata.(sprintf('file_%d',i )) = dlmread(file(i).name, ';', 761, 0);
save('Datafile.mat', 'dewidata', '-append');
end
Arrays sind dann mit zero() zu vereinbaren, wenn sie im Laufe einer Schleife/ der Weiterverarbeitung größer gemacht würden. Z.B. wenn man an das Ende eines Arrays immer einen Wert hinzufügen will, dann ist es besser, einen Nullen-Array über die finale Größe als Variable zu definieren und mittels eines Laufindex die Position zu ermitteln/ verwalten, anstatt z.B. array(end+1) zu verwenden.
Reine Zuweisungen der Form a = b; benötigen keine Preallocation.
Ich kann bei Deinem Code allerdings dieses Sukzessiv-Verhalten nicht entdecken. Kannst Du mir da bitte etwas helfen?
Gibt es ein Ist und ein Wunsch-Soll? Gibt es Beispiele zum Durchprobieren? Wenn selbstgeschriebene Funktionen aufgerufen werden: können sie bitte angehangen werden? Gab es Fehlermeldungen?
Stimmen die Werte, wenn der Debugger mit Haltepunkten etc. eingesetzt wird?
Danke
also was ich meine ist, das mein "dewidata" wie unten dargestellt aus sieht.
Je mehr Dateien ich ins Verzeichnis lege, umso größer wird das dann. In der Regel arbeite ich mit 24 Dateien pro Verzeichnis, deren Aufbau identisch ist.
Ich hatte das so verstanden das ich jetzt die 24 [30000x249 double] vorher mit Nullen füllen muss. Hoffe das nun klar ist, was ich versuche bzw. momentan mache.
Es ist nicht hilfreich die Arrays in den Feldern the pre-allocieren (wie heißt das in Deutsch?!). Das wäre Zeitverschwednung, weil die Felder nicht elementweise überchrieben werden, sondern vollständig ersetzt.
Du könntest aber immerhin die Felder des Structs pre-allocieren, in dem Du sie zunächst als CELL definierst:
Code:
C = cell(m-n+1, 1);
D = cell(m-n+1, 1);
for i = n:m
C{i - n + 1} = sprintf('file_%d', i);
D{i - n + 1} = dlmread(file(i).name, ';', 761, 0);
end
Wenn man nämlich in einer Schleife immer neue Felder an einen STRUCT, muss jedesmal eine neue Liste mit Pointern auf die Daten und eine neue Liste der Feldnamen erstellt werden. Bei einem CELL-Array kann man aber vorher angeben, wie viele Elemente erwartet werden.
Die Umwandlung mit CELL2STRUCT ist übrigens verblüffend schnell. Die eigentlichen Daten werden dabei gar nicht kopiert, sondern nur die Listen mit den Pointern darauf. Intern sind CELLs und STRUCTs sehr ähnlich aufgebaut, was das konvertieren einfach macht.
CELL2STRUCT is übrigens 10% schneller, wenn man es mit {N x 1} Spalten-Arrays versorgt.
so ich habe das mal eben ausprobiert, klappt prima und ich brauche jetzt in der Tat weniger Zeit für das einlesen der Daten.
vorher: ca. 13 Minuten für 24 Dateien
jetzt: knappe 7 Minuten.
Danke nochmals.
JN
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.