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

Cell als mat-File und nur einzelne Einträge laden

 

hosti
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2011, 22:22     Titel: Cell als mat-File und nur einzelne Einträge laden
  Antworten mit Zitat      
Hallo Leute!

Habe schon gesucht aber noch nix gefunden oder auch übersehen, dann sorry.
Mein Problem, ich habe ein verdammt großes Cell Array dass mir sehr viel Arbeitsspeicher weg nimmt. Ich speichere dieses Cell nun als mat-File mit save ab und lösche es dann damit ich es aus meinem Workspace kriege. Zur Bearbeitung der Daten würde ich nun gerne (in einer Schleife) nur einen Cell-Eintrag (der eine Matrix enthält)wieder laden, und dann den nächsten usw...
Geht das irgendwie mit load oder einem anderen Befehl bzw. ist sowas überhaupt möglich?

lg
hosti
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: 29.01.2011, 03:56     Titel: Re: Cell als mat-File und nur einzelne Einträge laden
  Antworten mit Zitat      
Hallo hosti,

Nein, man kann nicht per LOAD ein einzelnes Element aus einem gespeicherten CELL-Array heraus holen. Dazu müsste man schon die einzelnen Elemente als separate Variablen abspeichern.
Wie groß ist das Array denn und welche Art von Daten enthält es?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2011, 10:27     Titel:
  Antworten mit Zitat      
Hallo Jan,

ok hatte ich mir schon gedacht.

Code:

whos
  Name                    Size                 Bytes  Class     Attributes

...            
  Y_cell                 29x1             1508001740  cell                
         
  w_gl                   29x1               60321740  cell                
...
 


Y_cell mit jeweils 5000x52x25 doubles und w_gl 5000x52 doubles.
Werden aber in Zukunft noch größer sein.
Folgendes möchte ich durchführen:
Code:

B = cellfun(@(x,y) bsxfun(@times,x,y), Y_cell, w_gl,'UniformOutput',false);
 

bzw. vielleicht in Schleife(?)
Code:

B = cell(LS,1);
for ii = 1:29
    for kk = 1:52

        B{ii,1}(:,kk,:) = bsxfun(@times,Y_cell{ii,1}(:,kk,:),w_gl{ii,1}(:,kk));
               
    end
end
 


Das Y_cell ist halt verdammt groß.
Habe gelesen dass wenn ich auf eine 64-Bit Version umsteige es funktionieren könnte. Werde schauen dass ich das am Wochenende machen kann.

lg
hosti
Private Nachricht senden Benutzer-Profile anzeigen
 
hosti
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.01.2011, 16:44     Titel:
  Antworten mit Zitat      
Hallo,

habe mein Problem vorerst mal so gelöst:

Speichere zuerst alle Einträge meines Y_cell Cells in einzelne Matrizen ab und lösche dann Y_cell aus meinem Workspace.
Code:

for ii = 1:29
    eval(['SH' num2str(ii) '=Y_cell{ii};'])
    save(['SH' num2str(ii)],['SH' num2str(ii)] )
    clear(['SH' num2str(ii)])
end
clear Y_cell
 


Zur Berechnung hol ich mir in einer Schleife jede einzelne Matrix wieder herein.
Code:

B = cell(29,1);
for ii = 1:29          
    load(['SH' num2str(ii)])

    B{ii,1} = bsxfun(@times,eval(['SH' num2str(ii)]),w_gl{ii,1});

    clear(['SH' num2str(ii)])
end
 


Für weitere Berechnungen mit B (die ja auch so groß ist) gehe ich gleich vor.

Zusätzlich habe ich am Wochenende auf ein 64Bit System umgerüstet. Sollte auch was bringen.

Kann damit bis jetzt einmal leben.

Sollte wer da noch bessere Vorschläge haben, dann bin ich ganz Ohr.

lg
hosti
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: 31.01.2011, 22:38     Titel:
  Antworten mit Zitat      
Hallo hosti,

Dir bei kanppem Arbeitsspeicher die Variablen-Tabellen mit dynamisch per EVAL erzeugten Variablen zuzuknallen ist mutig. Wesentlich sicherer wäre statt dessen:
Code:
for ii = 1:29
    Data = Y_cell{ii};
    save(['SH' num2str(ii), '.mat'], 'Data');
end

Dies dupliziert nicht die einzelnen Arrays! Data ist viel mehr ein Pointer of die gleichen Daten, so dass auch ein CLEAR überflüssig ist.
Ich vermute, ein einfaches FWRITE wäre schneller als SAVE.

Code:
B = cell(29,1);
for ii = 1:29          
    File = load(['SH' num2str(ii), '.mat'])
    B{ii} = bsxfun(@times, File.Data, w_gl{ii});
end

Auch hier ein paar kleine Änderungen:
1. Auf EVAL verzichten, da es immer fehlerträchtiug, schwer debugbar und gerade mit Speicher ineffizient umgeht.
2. '.mat' in den Dateinamen eingefügt - sicher ist sicher.
3. B{ii} ist schneller als B{ii, 1}, wenn B sowieso ein Vektor ist.
4. Output von LOAD in einer Variablen speichern, statt sie dynamisch in den Workspace zu schreiben. Das ist immer sicherer und hält genau wie die Vermeidung von EVAL die Speicher-Tabellen sauber: Matlab weiß schon beim Einlesen des M-Files, welche Variablen benutzt werden und kann das für die JIT-Acceleration verwenden.

Aber ein 64-Bit-System mit viel RAM ist ohne Frage die allerbeste Idee. Große Probleme lassen sich am besten in großen Computern berechnen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 83
Anmeldedatum: 08.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2011, 16:22     Titel:
  Antworten mit Zitat      
Hallo Jan!

1A!!!
Danke für die Hilfe!

lg
hosti
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.