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

.mat Dateien nacheinander laden, bearbeiten und speichern

 

FZS
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 16.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.12.2010, 13:26     Titel: .mat Dateien nacheinander laden, bearbeiten und speichern
  Antworten mit Zitat      
Hallo,

ich habe Versuchsdaten, die jeweils als double mit gleicher Struktur vorliegen (16 Spalten, mehr als 1e7 Zeilen). Jeder array ist in einer eigenen .mat Datei gespeichert, die Dateien heißen so wie die jeweilige Variable.
Ich möchte das postprocessing automatisieren, so dass die arrays nacheinander geladen werden und dann verschiedene Operationen auf den array durchgeführt werden.
Das ganze mal an einem vereinfachten Beispiel, zuerst erzeuge ich mal die Daten:

Code:

a1 = ones(15,2); save a1;
a2 = ones(15,2); save a2;
a3 = ones(15,2); save a3;
 


jetzt möchte ich beispielsweise eine dritte Spalte einfügen als Summe der ersten beiden und schreibe dafür ein m-file. Aktuell sieht das so aus:
Code:

d = uigetdir('','Auswahl Datenordner');
inputFileNames = dir(fullfile(d, 'a*.mat'));
for i = 1:length(inputFileNames)
    % Datei i laden
     eval(load (inputFileNames{i}));
    % Operationen durchführen
    eval(inputFileNames{i}(:,3)) = eval(inputFileNames{i}(:,1)+ inputFileNames{i}(:,2));
    % Variable i in Datei i.mat speichern
   
    % Variable i löschen
   
end
 


Als Fehlermeldung erhalte ich:
cell contents reference from a non-cell array object.

Wäre für einen kleinen Tipp bei diesem sicherlich einfachen Problem dankbar.

Gruß und ein frohes Fest,
Roman
Private Nachricht senden Benutzer-Profile anzeigen


FZS
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 16.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.12.2010, 22:38     Titel:
  Antworten mit Zitat      
ok, ich war vorhin nicht fit. vom Grundsatz hab ich es jetzt hinbekommen.
Unvollständig aber funktionierend:

Code:

clear
clc
d = uigetdir('','Auswahl Datenordner');
inputFileNames = dir(fullfile(d, 'a*.mat'));
for i = 1:length(inputFileNames)
    % Datei i laden
    disp(inputFileNames(i).name);
    load (inputFileNames(i).name);
    % Operationen durchführen
    inputFileNames(i).name(:,3) = inputFileNames(i).name(:,1)+ inputFileNames(i).name(:,2);
    % Datei i speichern
   
    % Variable i löschen
   
end
clear i;
clear inputFileNames;
clear d;
 
Private Nachricht senden Benutzer-Profile anzeigen
 
FZS
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 16.10.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.12.2010, 22:38     Titel:
  Antworten mit Zitat      
Nach dem das Laden der Dateien so weit klappt, habe ich noch eine Frage zum Bearbeiten der Datensätze.

inputFileNames(1).name erhält in dem Beispiel den Wert

ans =

a1mat

Der Punkt als Trennung zwischen Dateinamen und Erweiterung ist durch ein anderes Zeichen (ein Viereck) ersetzt. Der load Befehl funktioniert trotzdem, aber ich habe Probleme, die Operationen auf die geöffneten Variablen anzuwenden. Fileparts funktioniert in dem Fall beispielsweise nicht.
Das Bearbeiten funktioniert so, das speichern noch nicht:
Code:

clear
clc
d = uigetdir('','Auswahl Datenordner');
inputFileNames = dir(fullfile(d, 'a*.mat'));
for i = 1:length(inputFileNames)
    % Datei i laden
    disp(inputFileNames(i).name);
    load (inputFileNames(i).name);
    %aktuelle Variable
    lengthName = length(inputFileNames(i).name);
    NameVar = inputFileNames(i).name(1:(lengthName-4));
   
    % Operationen durchführen
        % inputFileNames(i).name(:,3) = inputFileNames(i).name(:,1)+ inputFileNames(i).name(:,2);
    eval([NameVar '(:,3) = ' NameVar '(:,1) + ' NameVar '(:,2)']);
   
    % Datei i speichern
    eval([save NameVar]);
    % Variable i löschen
    eval([clear NameVar]);
   
end
clear lengthName;
clear NameVar;
clear i;
clear d;
 


Die Fehlermeldung lautet: ??? eval(save a1)
|
Error: Unexpected MATLAB expression.

Wo liegt mein Fehler und gibt es einen besseren Weg, auf die so geladenen Variablen zu zu greifen?

Danke im Voraus,
Roman
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: 29.12.2010, 00:13     Titel:
  Antworten mit Zitat      
Hallo,

du musst an eval einen String übergeben.
Code:
eval(['save ' NameVar]);


Wie du selber merkst, ist das Arbeiten so äußerst mühsam und sollte daher nach Möglichkeit vermieden werden, indem man z.B. mit Cell Arrays oder Structure Arrays arbeitet.

Grüße,
Harald
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.12.2010, 15:51     Titel:
  Antworten mit Zitat      
Hallo FZS,

Code:

% eval([save NameVar]);
% Besser:
save(NameVar);
...
% eval([clear NameVar]);  % Bringt hier übrigens gar nichts!
% Besser:
clear(VarName);

% Bringt Dir das Löschen der Variablen hier irgendetwas?
% clear lengthName;
% clear NameVar;
% clear i;
% clear d;
 


Das Programm wäre weniger komplex und fehleranfällig, wenn die Ausgabe von LOAD nicht dynamisch eine Variable erzeugen würde, sondern die Ausgabe in einem Struct gespeichert würde:
Code:
Data = load(inputFileNames(i).name)

Dann könntest Du per FIELDNAMES die Namen der Variablen erfragen und mit dynamischen Feldnamen auf die Daten zugreifen:
Code:
Fields = fieldnames(Data);
Value = Data.(Fields{1});
Value(:, 3) = Value(:,1) + Value(:,2);
save(Fields{1}, 'Value');
 

Damit hätte man sich den gesamten EVAL-Kram gespart. Das wäre einfacher zu debuggen, weniger fehleranfällig und würde zudem noch schneller laufen.

Gruß, Jan
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.