Verfasst am: 30.03.2016, 18:04
Titel: Ploten mehrerer Spalten/Zeilen aus mehreren Dateien
Hallo Liebes Matlab-Forum,
ich sitze heute nun schon was länger an einem Problem was ich bis jetzt noch nicht lösen konnte. Leider habe ich bis jetzt nur Grundkenntnisse in Matlab..
Und zwar habe ich 100 Dateien, wo drin jeweils mehrere Zeitabschnitte für sechs verschiede Möglichkeiten angegeben sind. Sprich für die Sekunde 1 gibt es 6 verschiedene Daten für 6 verschiedene Geräte oä, für Sekunde 2 6 andere Daten derselben Geräte..
Nun muss ich all diese Zeilen aus allen 100 Dateien gegeneinander Plotten (später davon lediglich die Standardabweichung/Mittelwert bzw nur einen Boxplot).
So weit bin ich bis jetzt mit dem Code gekommen (hatte schon ein wenig Hilfe):
for i=1:1:6 % die Iteration orientiert sich an der Anzahl an Reihen, bei mir sind es 6
mh{i} = data(i:6:end,1);
% Hier musst du die richtigen Spalten für die Parameter eingeben (1 ist Zeit, 10 ist T%emperatur z.B.). Ich muss alle Spalten gegen die Zeit plotten, aber das kann %ruhig nacheinander in verschiedenen Diagrammen geschehen
mhead{i} = data(i:6:end,9);
mT{i} = data(i:6:end,10);
mp{i} = data(i:6:end,11);
mb{i} = data(i:6:end,17);
end
%hier wird nun geplottet
figure;
clf;
hold on
plot(mh{1,1}*s2y,mT{1,1},'-')
count=0;
for j = 1:1:6
count = count + 1
%figure plot(mh{1,j}.*s2y,mT{1,j},'-') title(['temperature at mp ',count]);
xlabel('t (y)') ylabel('T (???C)')
%ylim([2090])
Mein Problem: Anfangs habe ich versucht lediglich eine Datei zu plotten, das hat auch gut funktioniert und das Diagramm wurde korrekt mit 6 verschiedenen Graphen erstellt. Allerdings rechnet er mit diesem Code zwar auch durch, auch viel länger als nur mit einer Datei, trotzdem kriege ich aber nur die erste Datei als Plot und nicht alle zusammen (das wird erstmal ja auch unübersichtlich aussehen, soll später ja aber nur durch die Standardabweichungen etc. dargestellt werden)
Ich nehme mal an die erste Hälfte ist korrekt und es hapert an dem plotten, leider sind meine Kenntnisse aber schon aufgebraucht..
überschreibst du data in jeder Iteration. Am Ende ist es also so, als ob nur die letzte Datei geladen worden wäre.
Ansonsten bitte immer (und insbesondere, wenn der Code nicht ausführbar ist, weil die Daten fehlen) dazuschreiben, was passiert, wenn du den Code ausführst: gibt es eine Fehlermeldung? Unerwünschte Ergebnisse? Welche / inwiefern?
Heute Abend werde ich das mal probieren, grade schaffe ich es nicht..
Also der Code läuft problemlos durch und es kommt keine Fehlermeldung, er rechnet auch länger als vorher, wo ich nur eine Datei geplottet habe (das hat problemlos funktioniert). Nur wird eben trotzdem nur eine Datei geplottet, ich nehme grad an dass es wirklich auch nur die erste der 100 Dateien war, auch das werde ich später noch mals genauer überprüfen..
wenn der Code für eine Datei funktioniert, wäre die einfachste Lösung, den weiteren Code (Daten aus den jeweiligen Spalten extrahieren und plotten) mit in die Schleife zu packen, in der die Datei geladen wird. Sprich...
Code:
for i=1:Anzmat
data = load(['blablabla_' num2str(i) '_blabla.dat']) % hier Daten extrahieren und plotten end% dieses end nach unten ans Ende des codes setzen.
Allerdings dann unbedingt die Schleifenzähler anpassen. In der 2. for Schleife darf i dann nicht mehr genutzt werden.
So werden zwar alle Daten geplottet. Braucht man sie dann aber nochmal für weitere Berechnungen/Darstellungen, sind sie nur vom letzten file vorhanden. Ansonsten müsste man sich ein Konzept überlegen, wie man die Daten für alle Datensätze abspeichert. Z.B. in cell-arrays oder
struct
. Da wäre für weitere Hilfe allerdings ein Beispieldatensatz von Vorteil.
ich würde das ganze mal versuchen indem ich die erste Datei in meine Matrix 'data' schreibe, anschließend springst du mit der for-Schleife jeweils zur letzten Zeile deiner Matrix und fügst die nächste Datei an.
Code:
d = dir('*_blablabla.dat'); % nur *.dat-Dateien betrachten
Anzmat = length(d); % anzahl der *.dat-Dateien
data=load('blabla_1_blabla.dat'); % erste Datei in Matrix data Schreiben 6 Zeilen und n Spalten
for i=2:Anzmat
data(end+1:end+6,:) = load(['blablabla_' num2str(i) '_blabla.dat'])% Zur letzten Zeile der Matrix data springen und dort den Inhalt der nächsten Datei anhängen end
entsdchuldigung, 300 bis 400 Zeilen insgesamt meinte ich nicht Spalten, die bleiben immer gleich. Aber muss halt jede der 6 Zeilen jeweils plotten und dass die ganze Datei über und das bei allen 100 Dateien gleichzeitig..
ach so. Ich bin davon ausgegangen das die Zeilen- und Spaltenanzahl konstant ist.
Das erklärt zumindest die Fehlermeldung, da du dann versuchst unterschiedlich große Matrizen ineinander zu fügen und somit deine Dimensionen nicht mehr passen.
Kannst du mal zwei deiner Dateien Hochladen? Dann kann man das besser ausprobieren.
for i=2:Anzmat
file=load(['blabla_' num2str(i) '_blabla.dat']); % Laden der Datei
x=size(file); % Bestimmen der Größe der Datei
data(end+1:end+x(1),:) =file; % Solange ans Ende von "data" anhängen bis die aktuelle Datei zu ende ist end
Ich lade jetzt die Datei und speichere sie zwischen, dann wird die Größe der Datei bestimmt, um anschließend die Anzahl von Zeilen in "data" zu schreiben. Mit den Dateien die du mir zur Verfügung gestellt hast funktioniert das Wunderbar, ich hoffe nur das deine Spaltenanzahl konstant ist! Ansonsten müsstest du zuerst alle Dateien einmal durchlaufen lassen und die größte Spaltenanzahl bestimmen und bei den restlichen Dateien, die leeren Spalten mit Nullen füllen, ansonsten bekommst du wieder ein "dimension mismatch".
Ich hatte das eigentlich so verstanden das jede Datei nur 6 Zeilen hat...
vielen Dank für die Lösung, werde jetzt wohl alle Zeilen für alles sechs Grafiken geplottet!
Hab dann nur noch eine Frage zur Weiterverarbeitung:
Jede Funktion kommt ja hunderte mal vor, hatte mir folgendes überlegt um das ganze durch Standardabweichungen und Mittelwerte übersichtlicher zu machen (so dass ich nur ein bzw. zwei Funktionen für jeden der sechs Datensätze habe):
Code:
for i=1:1:6 % die Iteration orientiert sich an der Anzahl an Monitorpunkten. W???re bei dir also %1:1:6
mh{i} = data(i:6:end,1);
% Hier musst du die richtigen Spalten f???r die Parameter eingeben (1 ist Zeit, 10 %ist Temperatur z.B.)
mhead{i} = data(i:6:end,9);
mT{i} = data(i:6:end,10);
mp{i} = data(i:6:end,11);
mb{i} = data(i:6:end,17);
end
Muss quasi alle Parameter (mb, mp, mT, mhead) einzelnd gegen mh plotten und hatte mir das hier überlegt. Scheint wohl aber zu "simple" zu sein, ich kriege folgende Fehlermeldung:
Dann kannst du in deiner nächsten Schleife sagen, das du die werde Addierst:
Code:
for i=2:Anzmat
file=load(['Tondern_sgsim_70L_' num2str(i) '_monitor.dat']); % Laden der Datei
x(i,:)=size(file); % Bestimmen der Gr??e der Datei
data(end+1:end+x(i,1),:) =file; % Solange ans Ende von "data" anh?ngen bis die aktuelle Datei zu ende ist end
g1=data(1,:); % Erste Zeile von data auslesen und in g1 (Gerät1) Speichern
g2=data(2,:); % Zweite Zeile von data auslesen und in g2 (Gerät2) Speichern for n=1:100
g1=g1+data(x(n)+1,:); % Die erste Zeile von data (=1Zeile aus Datei1)+289 Zeile von data (=1Zeile aus Datei2) usw.
g2=g2+data(x(n)+1,:); % Die zweite Zeile von data (=2Zeile aus Datei1)+290 Zeile von data (=2Zeile aus Datei2) usw. end
mittel_g1=g1/100; % arithmetischer Mittelwert für Gerät 1
mittel_g2=g2/100; % arithmetischer Mittelwert für Gerät 2
Hat funktioniert, vielen Dank an alle die geholfen haben
Einstellungen und Berechtigungen
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.