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

Ploten mehrerer Spalten/Zeilen aus mehreren Dateien

 

Geronimo234
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.03.2016, 18:04     Titel: Ploten mehrerer Spalten/Zeilen aus mehreren Dateien
  Antworten mit Zitat      
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):

Code:

clear all;
close all;
clc;

s2y = 1/(3600*24*365.25); % rechnet sekunden in 1000 Jahre um

d = dir('*_blablabla.dat');                   % nur *.dat-Dateien betrachten
Anzmat = length(d);             % anzahl der *.dat-Dateien

 for i=1:Anzmat                    
    data = load(['blablabla_' num2str(i) '_blabla.dat'])  
%die Dateinamen lauten blabla_1_blabla, wobei Zahlen von 1-100 vorhanden sind
end


[L1,L2] = size(data);

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([20 90])
   
end


 


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

Über Hilfe wäre ich also sehr dankbar Smile

Liebe Grüße,
Geronimo234
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.495
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.03.2016, 21:04     Titel:
  Antworten mit Zitat      
Hallo,

ein Problem auf jeden Fall:
mit den Zeilen
Code:
for i=1:Anzmat                    
    data = load(['blablabla_' num2str(i) '_blabla.dat'])  
%die Dateinamen lauten blabla_1_blabla, wobei Zahlen von 1-100 vorhanden sind
end

ü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?

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

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.03.2016, 10:16     Titel:
  Antworten mit Zitat      
Hallo Harald,

vielen Dank schon mal für die Antwort!

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

Liebe Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Geronimo234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2016, 18:29     Titel:
  Antworten mit Zitat      
Ich habe grade mal nachgeschaut, also letztendlich geplottet wird nur die erste Datei..

Hat jemand eine Idee wie ich die Dateien laden kann ohne sie zu überschreiben und sie anschließend alle zusammen plotten kann?
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 01.04.2016, 20:08     Titel:
  Antworten mit Zitat      
Hallo,

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.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
BBecks
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.04.2016, 11:23     Titel:
  Antworten mit Zitat      
Hi Geronimo,

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
 


So solltest du dann eine Matrix mit 600 Zeilen erhalten die du auswerten kannst.
Du müsstest halt dem entsprechend deine anderen Schleifen anpassen.

EDIT: Sorry, da hat sich ein Fehler eingeschlichen, habe den Code angepasst. Jetzt sollte es gehen.
Beste Grüße
BBecks
Private Nachricht senden Benutzer-Profile anzeigen
 
Geronimo234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.04.2016, 09:41     Titel:
  Antworten mit Zitat      
Hallo BBecks, hallo DSP,

danke auch euch beiden für eure Hilfe!

@DSP: Ja leider muss ich später mit den Daten noch weiter rechnen, von daher brauche ich sämtliche Daten in einem..

@BBecks:

Habe grade mal versucht da was zu basteln mit deinem Command, kriege nur folgende Fehlermeldung:

Code:


Subscripted assignment dimension mismatch.

Error in bla (line 20)
    data(end+1:end+6,:) = load(['blabla_' num2str(i) '_blabla'])

 



Liegt dass dann an Input der Datei? diese sieht folgendermaßen aus:

% time etc etc etc etc etc etc etc etc etc etc etc
%
1 ...
1 ...
1 ...
1 ...
1 ...
1 ...
%
1 ...
1 ...
1 ...
1 ...
1 ...
1 ...

__________________

Also immer der selbe Aufbau, 6 Zeilen a insgesamt 18 Spalten, jede der 100 Dateien ist allerdings unterschiedlich lang (um die 300 bis 400 Spalten..)
Private Nachricht senden Benutzer-Profile anzeigen
 
Geronimo234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2016, 11:42     Titel:
  Antworten mit Zitat      
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..
Private Nachricht senden Benutzer-Profile anzeigen
 
BBecks
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.04.2016, 17:30     Titel:
  Antworten mit Zitat      
Hi,

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.

Beste Grüße
BBecks
Private Nachricht senden Benutzer-Profile anzeigen
 
Geronimo234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.04.2016, 10:35     Titel:
  Antworten mit Zitat      
hab ein Archiv mit den ersten und letzten drei sowie das matlab skript mal hochgeladen..

passwort schicke ich dir per pn Smile

Matlab.zip
 Beschreibung:

Download
 Dateiname:  Matlab.zip
 Dateigröße:  67.52 KB
 Heruntergeladen:  258 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
BBecks
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.04.2016, 16:30     Titel:
  Antworten mit Zitat      
Hi,

sorry hat doch etwas länger gedauert, dafür jetzt die Lösung Very Happy

Code:

d = dir('*_monitor.dat');       % nur *.dat-Dateien betrachten
Anzmat = length(d);             % anzahl der *.dat-Dateien

data = load('blabla_1_blabla.dat') ;

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

Ich hoffe das hilft dir?

Beste Grüße
BBecks
Private Nachricht senden Benutzer-Profile anzeigen
 
Geronimo234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.04.2016, 11:24     Titel:
  Antworten mit Zitat      
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

mh.mittel = mean(mh)
mhead.mittel = mean (mhead)
mT.mittel = mean (mT)
mp.mittel = mean (mp)
mb.mittel = mean (mb)

mh.std = std(data)
mhead.std = std(mhead)
mT.std = std (mT)
mp.std = std (mp)
mb.std = std (mb)

 


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:

Code:

Error in mean (line 115)
        y = sum(x, dim, flag)/size(x,dim);

Error in Tondern_70L (line 44)
mh.mittel = mean(mh)

 


Denke mal da es sechs Monitorpunkte in jeder Datei gibt lässt sich nicht so einfach mean und std bzw. ein Boxplot berechnen. hat jemand eine Idee?
Private Nachricht senden Benutzer-Profile anzeigen
 
BBecks
Forum-Anfänger

Forum-Anfänger


Beiträge: 14
Anmeldedatum: 26.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2016, 14:08     Titel:
  Antworten mit Zitat      
Hi,

ja die Null muss noch durch die Spaltenzahl von Datei 1 ersetzt werden:

Code:

data = load('Tondern_sgsim_70L_1_monitor.dat') ;
x(1,:)=size(data);
 


Die hat 288 Spalten.

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

 


Das machst du für alle deine 6 Geräte und schon hast du deinen Mittelwert und kannst mit den Vektoren g1,g2,...,g6 noch andere Berechnungen anstellen.

Beste Grüße
BBecks

PS: Ich wieder ins Forum, falls später nochmal solche Fragen auftreten, hoffe es ist nicht zu viel dazwischen verloren gegangen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Geronimo234
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 30.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.04.2016, 12:54     Titel:
  Antworten mit Zitat      
Hat funktioniert, vielen Dank an alle die geholfen haben Smile
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.