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

Variablen aus eingelesenem MAT-File in Schleife löschen

 

Melanie

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2009, 17:58     Titel: Variablen aus eingelesenem MAT-File in Schleife löschen
  Antworten mit Zitat      
Hallo liebe Helfer (hoffentlich),

ich suche schon seit Stunden nach einer Lösung meines Problems, leider finde ich aber nichts, was mir weiterhilft.
Ich mache eine Bildauswertung und muss dafür bis zu 1500 Bilder einlesen. Diese stehen mir als Matrix in einem MAT-File zur Verfügung. Ich lese in einer for-Schleife nun die MAT-Files ein, schreibe die für mich wichtige Matrix als Bild heraus und lese danach das nächste File ein, um nach Beenden der Schleife alle generierten Bilder zu mitteln.
Schön und gut, leider hat jedes Bild knapp 600KB und mein PC ist am Ende seiner Speicherkräfte. Ich möchte also nach jedem Schleifendurchgang die Variablen aus der eingelesenen MAT-Datei löschen, nicht aber die anderen Variablen meiner Schleife, geschweigedenn meines Programms.
Hier mal schematisch die Schleife, um die es geht:
Code:
% Schleife zum Einlesen der Bilder
for i=start:ende                                                    
  this_bild = char(dateinamen_sortiert(i,:)); % liest Bild
  length_name = length(this_bild) - 4;        % Verkürzt Dateiname um Endung ".MAT"
  this_name = this_bild(1:length_name);                
  load(sprintf('%s/%s/%s', pfad,fall,this_name)); % lädt Variablen der Datei
  img_jet = eval(this_name);                      % Aktuelles Bild
  img_sub = img_bg - img_jet;                    % Subtrahiert Bild von Hintergrund
  this_data = imcrop(img_sub, crop);           % Bestimmt den Ausschnitt des Bildes
    if i == start                                 % if-Schleife summiert Strahlbilder
      img_dif = this_data;  
    else
      img_dif = img_dif + this_data;
    end
end  
bilder = (i-start);
img_dif = img_dif / bilder;

In der Variable "this_name" steht nun genau der Variablenname (=Dateiname des Bildes ohne die Endung .MAT), der unter "whos" mit 600KB aufgeführt ist. Wie lösche ich denn nun den Inhalt von this_name?
Habe einen Tipp mit sprintf gelesen, aber irgendwie geht das nicht. sollte so heißen:
Code:
sprintf('clear %s',this_name)

Führt also nicht zum Ziel. Außerdem sind ja noch weitere Variablen aus dem MAT-File eingelesen worden (in der Form Dateiname_Datum, Dateiname_Zeit etc.), wenn die auch noch verschwinden würden, wär das prima Smile
Habt ihr einen Tipp für mich? Ich verzweifle langsam, da ich mit einem überlasteten Rechner echt nicht vernünftig arbeiten kann Sad

Würde mich über Antworten freuen!
Viele Grüße


Olli
Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 19.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2009, 19:20     Titel:
  Antworten mit Zitat      
Eventuell mit der Funktion "clear"?


Code:



Ansonsten wäre da eventuell noch die Möglichkeit die Variable mit Null bzw leer zu überschreiben?!

Code:
this_name = []


Vielleicht verstehe ich auch die Frage falsch.
Private Nachricht senden Benutzer-Profile anzeigen
 
Melanie

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2009, 19:37     Titel:
  Antworten mit Zitat      
Hi Olli,

this_name enthält den Variablennamen der Variable, die ich löschen möchte, Beispiel:

Code:
this_name = Dateiname;


Das Problem ist, wenn ich

Code:


benutze, dass dann nur die Variable this_name gelöscht wird, nicht aber die eigentliche Variable (nach dem Beispiel oben "Dateiname"), die ja bloß durch this_name aufgerufen wird.
Wärs nur EINE Variable à la "Dateiname" wäre das ja manuell möglich, sind aber 1500 Stück, die sich im Laufe der Schleife aufsummieren...

Herrje, vielleicht muss ich direkt beim Indizieren etwas anders machen...
 
Olli
Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 19.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2009, 20:18     Titel:
  Antworten mit Zitat      
Dann hab ich wohl das Problem nicht verstanden. Ich dachte das this_name dein Variablenname ist in den halt das Bild als Matrix reingeladen wird. Durch die Schleife müßte dann doch jeweils das neue Bild in der this_name über das alte drüber gebügelt werden. Oder du machst mittels Hochzähler nen Array aus deiner Variablen.

Code:
this_name(i) = this_bild(1:length_name);


dann müßtest du doch mittels des clear-Befehls einzelne Elemente aus deinem Array rauslöschen können oder nicht? Ich bin noch neu in Matlab ich versuch das Problem jetzt nur anhand eines Lösungsweges von anderen Programmiersprachen anzugehen.

Vielleicht könntest du ja mal den kompletten Code hochladen das man das mal lokal testen und nach einer Lösung suchen kann.

P.S. ich hab auch vorgestern in einem Thema gelesen das es helfen soll wenn man vorher die Variable bzw Matrix mit Nullen belegt also schon erstellt, damit Matlab genügend Speicher sichern kann. Da wollte ein User 500.000 Datensätze einlesen und jemand meinte das das für Matlab eigentlich kein Problem wäre.
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2009, 21:08     Titel:
  Antworten mit Zitat      
Hach Olli,
manchmal kommt man selbst nicht auf die simpelsten Zusammenhänge... Dank deiner Hinweise ist mir aufgefallen, dass ich den load-Befehl einfach so hingeschrieben habe - kein Wunder, dass ich nachher nicht mehr drauf zugreifen kann!
Ich habs also nun gelöst, indem ich in der Schleife einfach
Code:
inhalt = load(sprintf('%s/%s/%s', pfad,fall,this_name)); % lädt Variablen der Datei
bildmatrix = getfield(inhalt,sprintf('%s',this_name'));


gesetzt habe. Jetzt kann ich vor dem Ende der Schleife die Variablen "inhalt" und "bildmatrix" mit clear löschen und die 600KB sind direkt mit gelöscht.

Dadurch hat sich die Dauer des Rechenprozesses um sicherlich 500% und aufwärts verkürzt Smile
(Wer hat schon ein Gig Arbeitsspeicher? Meine 5 Jahre alte Möhre sicher nicht Rolling Eyes )

Also danke dir, kann ich ja am Freitag Abend doch noch friedlich in den Feierabend starten...
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.08.2009, 21:22     Titel:
  Antworten mit Zitat      
Hallo,
Zitat:
In der Variable "this_name" steht nun genau der Variablenname (=Dateiname des Bildes ohne die Endung .MAT), der unter "whos" mit 600KB aufgeführt ist. Wie lösche ich denn nun den Inhalt von this_name?
Habe einen Tipp mit sprintf gelesen, aber irgendwie geht das nicht. sollte so heißen:

Die Variablen kann man nur mit clear Befehl aus dem Speicher löschen
Code:

% ruft man eine Funktion ohne Klammer auf
% wird alles was hinter Funktion kommt als String interpretiert

%  clear erwartet Variablennamen als String
% und darum löscht nur this_name
clear this_name
 


Code:

% rufe clear mit Klammern auf,
% dann wird nur die entsprechende Variable gelöscht,
clear(this_name)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.08.2009, 21:29     Titel:
  Antworten mit Zitat      
Hallo,
Genau so ist es besser,
man soll wirklich load einen variablen zuweisen,
soll speicher-effektiver sein, als ohne.

ich habe da noch einen Verbesserungsvorschlag:
Stichwort Dynamische Felder, sind schneller als getfield

Code:

inhalt = load(sprintf('%s/%s/%s', pfad,fall,this_name)); % lädt Variablen der Datei

%  statt
bildmatrix = getfield(inhalt,sprintf('%s',this_name'));

% so zumachen
bildmatrix = inhalt.(this_name);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Melanie

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2009, 22:03     Titel:
  Antworten mit Zitat      
Hallo denny,

hab deinen Verbesserungsvorschlag eingebaut, dankeschön!

Wahrscheinlich ist mein ganzes Skript noch verbesserungswürdig, aber jetzt läufts wenigstens Very Happy

Hab erst vor 3 Wochen angefangen mit Matlab und immerhin jetzt eine komplette Bildauswertung programmiert - damit bin ich jetzt erstmal zufrieden.

Danke für die Tipps - tolles Forum hier!
 
Olli
Forum-Anfänger

Forum-Anfänger


Beiträge: 45
Anmeldedatum: 19.08.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.08.2009, 22:47     Titel:
  Antworten mit Zitat      
Meld dich doch einfach mal im Forum an. Hier gibt es auch irgendwo ein Thema welches kostenlose Skripte und Howto`s zu Matlab verlinkt. Bin auch erst durch Zufall vor ein paar Tagen wärend meines Matlab Kurses in der Uni auf das Forum gestoßen. Sah vielversprechend aus und so hab ich mich schnell mal registriert.
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 - 2024 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.