WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Wie Cell-Array initialisieren zwecks Geschw.-Optimierung

 

JN78
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 13.08.2010, 13:07     Titel: Wie Cell-Array initialisieren zwecks Geschw.-Optimierung
  Antworten mit Zitat      
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?

Code:
close all;
clear all;
clc;

file = dir('*.csv');
   
tmp_length = length(file);
n=1;
m=10;

while tmp_length > 10
   
    for i = n:m
        dewidata.(sprintf('file_%d',i )) = dlmread(file(i).name, ';', 761, 0);
    end
   
    tmp= tmp_length - m;                        
   
        if exist('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


In dewidata sind dann meine 24 Files drin. In "file_x" ist <30000x249 double>

Ich muss dann quasi 24 mal 30000x249 mit nullen füllen und das in dewidata ablegen, wenn ich das richtig verstanden habe?!

Danke für Eure Hilfe

Jan
Private Nachricht senden Benutzer-Profile anzeigen


yankemen
Forum-Century

Forum-Century


Beiträge: 104
Anmeldedatum: 14.04.10
Wohnort: ---
Version: 32: 2008a & 2010a
     Beitrag Verfasst am: 13.08.2010, 13:37     Titel:
  Antworten mit Zitat      
Moin Jan,

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?


Ciao,
yankemen
_________________

Code:
% Kommentare brauchen ein Leerzeichen nach dem %
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 Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
JN78
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 13.08.2010, 18:17     Titel:
  Antworten mit Zitat      
Hallo Yankemen,

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.

Code:

dewidata =

    file_1: [30000x249 double]
    file_2: [30000x249 double]
    file_3: [30000x249 double]
    file_4: [30000x249 double]
    ...
    file_24: [30000x249 double]
 


hier fülle ich dann mein Cell-Array

Code:

for i = n:m
        dewidata.(sprintf('file_%d',i )) = dlmread(file(i).name, ';', 761, 0);
    end
 


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.

Gruß Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 13.08.2010, 22:46     Titel:
  Antworten mit Zitat      
Hallo Jan,

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

oldC = fieldnames(dewidata);
oldD = struct2cell(dewidata);
dewidata = cell2struct(cat(1, oldD, D), cat(1, oldC, C));
 

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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
JN78
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 14.08.2010, 12:10     Titel:
  Antworten mit Zitat      
Moin,

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
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.