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

save variierende Variablen

 

Doppler
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.07.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 20.07.2013, 13:18     Titel: save variierende Variablen
  Antworten mit Zitat      
Hallo!
Ich habe einen Ordner mit viele Dateien im Format trxxstxxdxx_mean.mat bestehend aus einer 3x3 Matrix. Nun soll in allen ein bestimmter Wert verdoppelt werden. Das funktioniert auch so weit. Mein Problem ist das Speichern auf den Ausgangsnamen der Datei, weil ich die Variable "intData" eingeführt habe.

Mein Code sieht folgendermaßen aus. Der letzte Befehl lässt sich nicht ausführen, evtl. auch nur ein Syntaxfehler, auf den ich nicht komme:

Code:
path = 'C:\Users\Susanne\Documents\MATLAB\BA BI\ADVPP01\ADV_ol\*.mat';
liste = dir(path);
files = {liste.name};

for k=1:size(liste,1);
   
    s=['load(liste(k,1).name, ''*mean'');'];
    eval(s);
   
    s=['varName=who(''*mean'')'];
    eval(s);
   
    s=['intData=' char(varName)];
    eval(s);
   
    %Variable ausbessern
   
    intData(1,3)=2*intData(1,3)
     
    %neue Variable in eigentliche Datei integrieren
   
    s=['save(''ADVPP02\' liste(k,1).name ',''intData'')']
    eval(s)  
   
    clear *mean

end


Vielen Dank für hilfreiche Tipps!
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2013, 13:28     Titel:
  Antworten mit Zitat      
Hallo,

versuche doch, ohne EVAL auszukommen. Das macht das ganze nur unnötig schwierig zu debuggen.
Zudem würde ich die Daten jeweils in eine Struktur laden, also z.B. so:
Code:
data = load(liste(k).name, '*mean');


Zitat:
Der letzte Befehl lässt sich nicht ausführen

Wie äußert sich das? Gibt es eine Fehlermeldung? Welche?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 20.07.2013, 13:31     Titel:
  Antworten mit Zitat      
oh gott warum sind da so viele evals? Smile
von eval sollte man wenns geht die finger lassen. macht das ganze sehr schwer zu debuggen. und es ist in deinem code auch meiner meinung nach nicht nötig eval zu benutzen. man kann strings auch so zusammen setzen ohne eval

edit oh da war jemand schneller ^^
Private Nachricht senden Benutzer-Profile anzeigen
 
Doppler
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.07.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 20.07.2013, 15:01     Titel:
  Antworten mit Zitat      
Schonmal danke für die schnellen Antworten.
Tut mir leid, ich bin ziemlicher Matlab-Anfänger und vor allem was das automatische Durchlaufen meiner Dateien betrifft, sehr unwissend. Mein Betreuer hat mir einen Code mit solchen evals vorgeschlagen.
Harald, wenn ich statt des ersten s= und eval(s) deinen Vorschlag eingebe
Code:
data = load(liste(k).name, '*mean');

wird keine Datei geladen. Hab ich das richtig verstanden, dass das eigentlich der Ersatz ohne eval wäre? Und welchen Vorteil hat die "data"-Struktur?

Die Fehlermeldung zum save ist einfach nur.
Zitat:
Error using Probe1_Mean_Korrektur (line 27)
Error: Unexpected MATLAB expression.

Das hilft leider nicht sehr viel weiter. Ich könnte mir vorstellen, dass es nicht genug oder zu viele Anführungszeichen sind.
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 20.07.2013, 17:38     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Mein Betreuer hat mir einen Code mit solchen evals vorgeschlagen.

Man kann an verschiedensten Stellen nachschlagen, dass EVAL nach Möglichkeit vermieden werden sollte - auf gomatlab ebenso wie beispielsweise auch in einem Blog von Loren Shure
http://blogs.mathworks.com/loren/2006/01/04/more-in-eval/

Zitat:
... wird keine Datei geladen.

Das würde mich aber sehr verwundern. Es sollte eine Struktur data entsehen, deren Felder alle in der .mat-Datei enthaltenen Variablen sind, die auf mean enden.

Zitat:
Und welchen Vorteil hat die "data"-Struktur?

Dass du nicht viele einzelne Variablen im Workspace herumliegen hast, sondern nur eine. Die Felder kann man bequem mit FIELDNAMES durchlaufen.

Zitat:
Error: Unexpected MATLAB expression.

Das ist dann ein schlichter Syntaxfehler. Mit "normalen" Befehlen kann man die leicht erkennen, weil sie im Editor hervorgehoben werden. Mit eval ist es dagegen sehr schwierig, da durchzublicken.

Ein Tipp: wenn du schon mit EVAL arbeitest, verwende mal DISP statt EVAL. Dann sieht man wenigstens, was genau EVAL ausführen würde, und kann so erkennen, wo das Problem liegt - in dem Fall ein fehlendes ' zwischen Dateiname und Komma.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Doppler
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.07.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 21.07.2013, 10:58     Titel:
  Antworten mit Zitat      
Super! Das speichern klappt jetzt. Es haben noch zwei ' gefehlt und ich konnte das mit Hilfe von DISP (bzw. der gleichen Anzeige in meinem Command Window beim Ausführen) herausfinden.
Der Save-Befehl sieht jetzt so aus:

Code:
s=['save(''C:\Users\Susanne\Documents\MATLAB\BA BI\ADVPP02\' liste(k,1).name ''',''intData'')'];
    eval(s);  


(Die evals habe ich noch behalten, damit ich nicht alles umschreiben muss, aber das nächste Mal kann ich mich auf die Datenstruktur stützen.)

Logischerweise speichert mir der Befehl jetzt die Variable 'intData' als Datei, nicht aber die Variablen von intData direkt. Gibt es eine einfach Möglichkeit sozusagen intData in die Datei auszuschütten, um diesen Zwischenschritt beim späteren Zugriff zu vermeiden? (Also alle Variablen von intData direkt in die Datei schreiben.)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.07.2013, 11:12     Titel:
  Antworten mit Zitat      
Hallo,

ich bin mir nicht sicher, ob ich die Frage verstehe.

Geht es dir darum, im Falle einer Struktur intData nicht die Struktur an sich, sondern die darin enthaltenen Felder in der .mat-Datei abzuspeichern? Dann hilft die Doku:
Zitat:
save(filename, '-struct', structName, fieldNames) stores
the fields of the specified scalar structure as individual variables
in the file.


Ansonsten bitte nochmal genauer erklären:
- zwischen Datei, Variable, und Felder einer Struktur unterscheiden
- was heißt hier "ausschütten"?
- welcher Zwischenschritt soll vermieden werden?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Doppler
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 20.07.13
Wohnort: ---
Version: R2013a
     Beitrag Verfasst am: 21.07.2013, 11:23     Titel:
  Antworten mit Zitat      
Ich hab ne Lösung gefunden, nicht schön, aber für meine Zwecke reicht das erstmal.
Vielen Dank also!
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.