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 mehreren .mat Dateien importieren und benennen

 

HPA69
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2010, 08:47     Titel: Variablen aus mehreren .mat Dateien importieren und benennen
  Antworten mit Zitat      
Hallo,
ich bin leider ein absoluter MatLab-Neuling und stehe vor einem für mich im Moment unlösbaren Problem.
Ich habe eine Reihe von Messungen gemacht und mir von der Messsoftware mehrere Dateien im Format *.mat generieren lassen. Ich kann zwar manuell die Daten über den Import Wizzard einlesen, die Variablen dann umbennen und die nächste Datei einlesen usw.
Aber das kann es ja irgendwie nicht sein. Kann mir jemand helfen wie ich dafür ne Funktion schreiben kann? Wäre echt klasse.
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: 08.12.2010, 12:33     Titel: Re: Variablen aus mehreren .mat Dateien importieren und bene
  Antworten mit Zitat      
Hallo HPA69,

Zitat:
Ich kann zwar manuell die Daten über den Import Wizzard einlesen, die Variablen dann umbennen und die nächste Datei einlesen usw.
Aber das kann es ja irgendwie nicht sein. Kann mir jemand helfen wie ich dafür ne Funktion schreiben kann?

Die Frage ist sehr allgemein gestellt. Deshalb kann ich auch nur eine sehr allgemeine Antwort geben:
Code:

FileList = dir([folder, '*.mat']);
nFile = length(FileList);
Data = cell(1, nFile);
for iFile = 1:nFile
   Data{iFile} = load(fullfile(folder, FileList(iFile).name));
end
 

Wenn Du uns mehr Details gibst, kommen vielleicht auch detailliertere Antoworten.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2010, 12:52     Titel:
  Antworten mit Zitat      
ich habe datei die wiefolgt bezeichnet sind
001_AB_Test_0000.mat
001_AB_Test_0001.mat
.
.
.
001_AB_Test_0005.mat
002_AB_Test_0000.mat
.
.
.
002_AB_Test_0005.mat
.
.
.
010_AB_Test_0005.mat
und in diesen Datein sind jeweils mehrere Variablen (ca. 10).
und jetzt möchte ich, dass die Variablen eingelesen werden und so umbenannt werden, dass sie der Ursprungsdatei zuzuordnen sind.
Bin jetzt soweit, dass ich die Daten einlesen kann, aber die Variablen beim einlesen der nächsten Datei einfach nur überschrieben werden anstatt eine neue Variable mit nem Index zu erzeugen.
Hier ist mal mein Code:
Code:

d=uigetdir('','Auswahl Datenordner');
cd(d);
pr=dir('*.mat');
names={pr.name};
for i = 1:numel(names)
  load ('-mat', filename);  
end
 
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: 08.12.2010, 13:13     Titel:
  Antworten mit Zitat      
Hallo HPA69,

Zitat:

001_AB_Test_0000.mat
...
und jetzt möchte ich, dass die Variablen eingelesen werden und so umbenannt werden, dass sie der Ursprungsdatei zuzuordnen sind.

Mach das nicht. Wenn Du eine komplizierte Method anwendest um Variablen-Namen wie "Var001_AB_0000" dynamisch zu erzeugen, wirst Du kurze Zeit später wieder eine komplizierte Method brauchen, um auf diese Variablen dynamisch zugreifen zu können.
Du findest in diesem Forum hunderte solcher Fragen. Es ist auf jeden Fall sauberer Programmiert und läuft effizienter, wenn Du als Index einen Index verwendest, und keinen kryptischen Variablennamen.
Cell-Arrays und Struct-Arrays sind für solche Aufgaben sehr gut geeignet.

Siehe auch:
http://matlab.wikia.com/wiki/FAQ#Ho......2C....2CA10_in_a_loop.3F

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2010, 13:22     Titel:
  Antworten mit Zitat      
Die Daten sind jetzt aber mit den Dateinamen vorhanden und es ist nicht möglich die Daten neu aufzunehmen. Es würde mir schon reichen, wenn die Meswerte einen Index von 1 bis z.B. 500 erhalten, aber genau das gelingt mir seid jetzt ca. 6 Stunden nicht. Ich sitze übrigens zum ersten mal an MatLab und bin kurz davor es nie wieder zu verwenden.
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: 08.12.2010, 14:18     Titel:
  Antworten mit Zitat      
Hallo HPA69,

Genau dafür ist diese Forum ja gedacht.
Also fange ich mal mit Deinem Code an und füge zuerstmal einen Output an das LOAD-Kommando an:
Code:

d=uigetdir('','Auswahl Datenordner');
cd(d);
pr=dir('*.mat');
names={pr.name};
for i = 1:1   % numel(names)
  Data = load ('-mat', filename);  
end

Was steht dann in Data drin und in welcher Form könntest Du die Ausgabe gebrauchen?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2010, 14:32     Titel:
  Antworten mit Zitat      
jetzt habe ich meine messwerte in einer Struktur.
Im Anhang ist mal ein Screenshot.
Ich bräuchte das nicht in einer Struktur aufgeteilt, sondern aus z.B. Data1_AI_0 sollte AI_0_1-0 werden wobei der Teil 1-0 in Zusammenhang mit den usprünglichen Dateinamen steht, oder zumindest AI_0_1, AI_0_2, ... heißt

mat1.JPG
 Beschreibung:

Download
 Dateiname:  mat1.JPG
 Dateigröße:  79.32 KB
 Heruntergeladen:  1644 mal
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: 08.12.2010, 15:16     Titel:
  Antworten mit Zitat      
Hallo HPA69,

Zitat:
Ich sitze übrigens zum ersten mal an MatLab und bin kurz davor es nie wieder zu verwenden.

Das wundert mich nicht. Die Daten-Struktur, mit der Du arbeitest, ist heftig verwurschtelt.
Leider kann ich aus ethischen Gründen nicht dabei behilflich sein, es noch weiter zu verkomplizieren. Die Indizes in die Namen der Variablen zu packen ist nie hilfreich und es gibt bei 500 (!!!) Variablen bestimmt keine Methode um einen Tippfehler zu finden oder gar zu verbessern. Und offenbar ist die Komplexität des Programms ja bereits jetzt nicht mehr bewältigbar.

Ich empfehle also nochmal wärmstens ein Struct-Array zu verwenden. Das würde es später sehr einfach machen, wieder auf die einzelnen Werte zuzugreifen, Mittelwerte etc zu berechnen. Mit "Data1_time_Fahrtweg___s_I_0_1" wird Dir das nicht gelingen.
Ein Struct-Array (oder Cell-Array) ist eine Art Tabelle, die eine bestimmte Ordnung hat. Ein Haufen von separaten Variablen ist wie ein Stapel Kartei-Karten mit je einem Namen und einer Zahl drauf -- und der nach dem Erstellen in die Luft geworfen wird.

Wenn Du aber unbedingt auf separaten Variablen bestehst, wünsche ich Dir, dass jemand anderes hier im Forum mutiger (skrupelloser) ist, also ich. :-)

Gruß und viel Erfolg, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
HPA69
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.12.2010, 15:36     Titel:
  Antworten mit Zitat      
Jan, ich glaube nicht, dass wir die gleiche Sprache sprechen. Hab jetzt mit ca. 10Stunden Studiume der Hilfe und diversen Foreneinträgen, mal selber was geschrieben. Ist vielleicht wirklich ganz sinnvoll das noch etwas anders zu ordnen, aber hier ist mal mein Code, den ich jetzt geschrieben habe und es damit vereinfacht habe.
Code:

d=uigetdir('','Auswahl Datenordner');
cd(d);
  for i=01:9
      str1 = num2str(i);
      for d=0:5
          str2= num2str(d);
            load(['00' str1 '_CS_Test_000' str2 '.mat']);
            str3 = [num2str(i) '_' num2str(d)];
            var = ['SA_L' char(str3)];
            assignin('base', var, Data1_SA_L);
      end
  end
  for e=10:10
      str5 = num2str(e);
      for g=0:5
          str6= num2str(g);
            load(['0' str5 '_CS_Test_000' str6 '.mat']);
            str7 = [num2str(e) '_' num2str(g)];
            varb = ['SA_L' char(str7)];
            assignin('base', varb, Data1_SA_L);
      end
  end    
 


Ist zwar noch nicht wirklich anwenderfreundlich und universell einsetzbar, aber das kommt später noch.
Wie bekomme ich denn die Daten die jetzt un einzelne Variablen gepackt habe in einen struct-array? Die Grunddaten sind leider von der Messtechnik vorgegeben und ich muss da jetzt erstmal Ordnung reinbringen.
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: 08.12.2010, 17:24     Titel:
  Antworten mit Zitat      
Hallo HPA69,

Zitat:
Jan, ich glaube nicht, dass wir die gleiche Sprache sprechen. Hab jetzt mit ca. 10Stunden Studiume der Hilfe und diversen Foreneinträgen, mal selber was geschrieben.

Ja, mit den unterschiedlichen Sprachen hast Du recht.
Ich bin zwar in diesem Forum noch neu, aber ich nehme seit 2004 in der CSSM-Newsgroup teil. So habe ich schon hunderte verzweifelte Fragen gelesen, die aus solchen Programmiermethoden entstehen, wenn die Programme im Laufe der Zeit weiter wachsen - und das machen alle Programme, es sei denn, sie werden wegen Nicht-Wartbarkeit gelöscht.

LOAD überschreibt z.B. ohne das Zuweisen des Output-Arguments lokale Variablen. Wenn Dir also irgendjemand mal ein MAT-File gibt, in dem 'str3' als Variable enthalten ist, wird Dein Programm wirre Ergebnisse produzieren.
Per ASSIGNIN dynamisch erzeugte Variablen behindern in Matlab den effizienten Zugriff auf die Daten. Am Anfang ist die Laufzeit eines Programms noch nicht so wichtig. Wenn man aber später versucht, da noch etwas geradezubiegen ist es meist effizienter, ganz von vorne zu beginnen.

Zu Deinem Code:
Code:

Das erzeugt Dir Zahlen mit 3 Ziffern und führenden Nullen. Dann könnte eine einzige Schleife von 1 bis 10 laufen.
Code:
var = ['SA_L' char(str3)];

"var" ist der Name eine Matlab-Funktion. Das erzeugt oft Probleme, wenn man später auf die Funktion zugreifen möchte.
Die Umwandlung mit "char" ist hier nicht nötig, da str3 schon ein String ist.

Zitat:
Wie bekomme ich denn die Daten die jetzt un einzelne Variablen gepackt habe in einen struct-array?

Wieso sie erst auseinandernehmen, um sie dann später wieder zusammen zu setzen?? Ich würde gleich so anfangen:
Code:

function Data = ImportMatFiles
d = uigetdir('','Auswahl Datenordner');
pr = dir(fullfile(d, '*.mat'));
names = {pr.name};
Data = cell(1, numel(names));
for i = 1:numel(names)
  Data{i} = load ('-mat', fullfile(d, names{i}));  
end
 

Dann ist "Data{3}.Data1_SA_L" die entsprechende Variable aus dem dritten File. Und wenn man z.B. den Mittelwert aus allen Data1_SA_L Feldern braucht:
Code:
M = mean([Data{:}.Data1_SA_L])

Die gezeigte Methode ist viel weniger empfindlich für Bugs, man kann die Anzahl der Dateien ohne jede Änderung auf 25.000 steigern, und die Lookup-Table der Variablen wird auch nicht durch ASSIGNIN zerpflückt. Ich verwende absoulte File-Namen, weil das Thread-sicher ist: Wenn irgendeine (später dazukommende?) Unter-Funktion oder der Callback eines Timer-Objekts den aktuellen Ordner ändert, macht das nichts.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2010, 08:10     Titel:
  Antworten mit Zitat      
Moin Jan,
das scheint wirklich die stabilere Lösung zu sein, aber für mein Datenhandling leider komplett unübersichtlich.
Mein Problem ist, dass ich 5 Produkte getestet habe und diese jeweils 6 mal. Deswegen ist eine fortlaufende Nummerierung nicht sehr hilfreich.
Deswegen wäre ein Index (1,1)...(1,6), (2,1)....(2,6), ...., (5,1)...(5,6) hilfreicher. Nun gibt es noch dazu zu sagen, dass die Blöcke nicht unbedingt 6 Messreihen enhalten müssen.
gibt da irgendeine Lösung das automatisiert auszuwerten?
Die Dateinamen haben am Anfang ne 3stellige Blocknummer um am Ende ne 4stellige Messreihennummer.
Beispiel
001_CS_Test_0001.mat
002_CS_Test_0001.mat

Meine Lösung ist leider auch alles andere als universell verwendbar, aber ich habe erstmal meine ersten Daten drin.
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: 09.12.2010, 16:08     Titel:
  Antworten mit Zitat      
Hallo HPA69,

Wie wäre es dann mit:
Code:

function Data = ImportMatFiles
nProduct = 5;
d = uigetdir('','Auswahl Datenordner');
pr = dir(fullfile(d, '*.mat'));
names = {pr.name};
Product = struct('Messung', cell(1, nProduct));
for i = 1:numel(names)
  aName = names{i};
  N = sscanf(aName, '%d_CS_TEST_%d', 2);
  if numel(N) ~= 2
     error('Cannot parse file name?!');
  end
  Product(N(1)).Messung{N(2)} = load ('-mat', fullfile(d, names{i}));  
end
 

Ich habe mal angenommen, dass der vordere Index die Produkt-Nummer ist. Ansonsten einfach N(1) und N(2) vertauschen.

Danach sind alle Messreihen des i-ten Produktes als "Product(i).Messung" gespeichert. Der Mittelwert einer Variable für ein bestimmtest Produkt ist dann wieder:
Code:
M = mean([Product(1).Messung{:}.Data1_SA_L])

Und die Anzahl der Messungen kann dabei von Produkt zu Produkt verschieden sein, ohne dass am Programm etwas geändert werden muss.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.12.2010, 16:54     Titel:
  Antworten mit Zitat      
funktioniert nicht...

??? Error using ==> ImportMatFiles
at 11
Cannot parse file name?!
Private Nachricht senden Benutzer-Profile anzeigen
 
HPA69
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 08.12.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.12.2010, 09:56     Titel:
  Antworten mit Zitat      
So, jetzt habe ich mal selber rumgespielt, aber hänge irgendwie wieder fest. Hier ist mal mein Code, der mit einer Fehlermeldung abgebrochen wird.
Code:

  for i=1:anz_t
      txt1 = num2str(i);
      for d=0:5
          txt2= num2str(d);
            filen = ['00' txt1 '_CS_Test_000' txt2 ];
            filename= char(filen);
            T(i).R{d} = struct('v_x', Data1_v_x, 'SA_R', Data1_SA_R,...
                'SA_L', Data1_SA_L, 'SA_mid', Data1_SA_mid,...
                'a_lat_CI', Data1_a_lat_CI, 'a_lat_RA', Data1_a_lat_RA,...
                'v_lat_FA', Data1_v_lat_FA, 'Yaw_CI', Data1_Yaw_CI)
               
      end
  end
 

Der Code wird mit der Fehlermeldung :
??? Structure assignment to non-structure object.

Error in ==> Datenimport at 22
T(i).R{d} = struct('v_x', Data1_v_x, 'SA_R', Data1_SA_R,...
abgebrochen.

Kann mir bitte jemand sagen, wo mein Fehler liegt?
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: 12.12.2010, 22:55     Titel:
  Antworten mit Zitat      
Hallo HPA69,

Versuche "T" vor der Schleife als Struct zu definieren:
Code:

  T = struct('R', {});
  for i=1:anz_t
...
  end
 

Hilft das?

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