Verfasst am: 08.12.2010, 08:47
Titel: Variablen aus mehreren .mat Dateien importieren und benennen
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.
Verfasst am: 08.12.2010, 12:33
Titel: Re: Variablen aus mehreren .mat Dateien importieren und bene
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
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
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.
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.
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
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. :-)
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.
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.
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.
"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:
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.
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.
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:
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
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.