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

Plotten von bestimmten Daten

 

nsj
Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 28.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2017, 00:11     Titel: Plotten von bestimmten Daten
  Antworten mit Zitat      
Hallo zusammen!
Ich bin noch recht frisch in der (Matlab-)Programmierung, komme allerdings leider nicht drumrum, mich relativ schnell einarbeiten zu müssen. Die Grundfunktionen habe ich auf jeden Fall im Griff, aber mittlerweile wird es doch etwas anspruchsvoller.

Folgendes Problem:
Ich bekomme Excel-Dateien mit verschiedenen Einträgen. Unter Anderem Artikelnummer, Datum, Prüfmerkmal, Nennwert, USG, OSG und Messwert. Die Tabelle hat weitere Spalten, die im Moment keinen Einfluss zu haben scheinen.

Nun versuche ich kurzfristig eine Methode zu finden, dem Programm die Rahmenbedingungen in Form von Artikelnummer, Datum und Prüfmerkmal vorzugeben und im Gegenzug die dazugehören Werte für das Nennmaß, USG, OSG und Messwert in einem Plot auszuspucken.

Mittelfristig würde ich versuchen das Ganze in Form eines grafischen Interfaces mit einem Drop-Down-Menü zu realisieren, allerdings muss ich mich in diesen Bereich noch komplett einlesen.

Gibt es eine Möglichkeit das Ganze zu realisieren? Wonach müsste ich da im Genauen schauen?
Meine erste Excel-Datei war eine sehr vereinfachte Version mit nur einer Artikelnummer und einem Prüfmerkmal, das Datum war mir da noch nicht wichtig.

Code:
[xlsfile,path2xls] = uigetfile('*.xlsx', 'Import-Daten');
import = xlsread(fullfile(path2xls,xlsfile));
NM=import(:,6);
USG=import(:,7);
OSG=import(:,8);
MW=import(:,9);
MW1=[];

for index = 1:size(MW)
     if MW(index)>2
          MW1=[MW1 MW(index)];
     end
end

NM1=[];
for index = 1:size(MW)
     if NM(index)>2
          NM1=[NM1 NM(index)];
     end
end

USG1=[];
for index = 1:size(USG)
     if USG(index)>2
          USG1=[USG1 USG(index)];
     end
end

OSG1=[];
for index = 1:size(OSG)
     if OSG(index)>2
          OSG1=[OSG1 OSG(index)];
     end
end

MW1=MW1';
NM1=NM1';
USG1=USG1';
OSG1=OSG1';
plot(NM1);
hold on
plot(USG1);

plot(OSG1);

plot(MW1);



Ich vermute stark, dass das nicht der eleganteste Weg ist, aber für das einfache Beispiel, konnte es mir ein brauchbares Ergebnis liefern.
In der angehängten Beispieldatei ist ein kleiner Auszug. In dieser sind die Artikelnummern sortiert, davon kann ich leider nicht immer ausgehen. Auch sind manche Felder nicht ausgefüllt, was in Matlab wohl zu einem NaN führt und vllt Schwierigkeiten beim Plotten verursacht. Oben habe ich da ein umständliches Workaround gemacht.

Ich würde mich über jeglichen Input freuen und bedanke mich schon mal im Voraus!


Gruß
nsj
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.04.2017, 10:53     Titel:
  Antworten mit Zitat      
Hallo,

Tables sind deutlich angenehmer, um mit Tables zu arbeiten ( readtable ).
Zum Sortieren kannst du dann sortrows verwenden.

Die for-Schleifen können leicht über logische Indizierung umgangen werden, z.B.
Code:
MW1 = MW(MW > 2);

... und bei Tables kannst du das sogar für alle Spalten auf einmal machen.

Für das Erstellen einer Oberfläche kannst du guide oder dessen Nachfolger appdesigner verwenden.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 28.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2017, 13:06     Titel:
  Antworten mit Zitat      
Hallo Harald,
vielen Dank schon mal. Konnte meinen bereits existierenden Code nun etwas verschönern.
An der anderen Front bin ich leider nicht weiter gekommen. Leider scheint die Beispieldatei nicht hochgeladen worden zu sein in meinem Anfangspost.
Wenn ich mit dem Befehl
Code:
T = readtable('Messwerte CX50-380 KW 12.xlsx','ReadRowNames',true);

Die Tabelle einlese, versteht Matlab nicht, wo die Überschriften sind. Er macht die erste Zeile zur Überschrift, die eigentlichen Überschriften befinden sich allerdings in Zeile 3. Außerdem versucht er mir die erste Spalte 'eindeutig' zu definieren und ändert dabei die Einträge ab, indem ein _1 durchlaufend nummeriert angehängt wird.

Aus dem Matlab-Artikel geht für mich leider nicht ganz hervor, wie ich diese Sachen anpassen kann.
Wenn ich weiter an mein Ausgangsproblem denke: Wenn ich diese Tabelle richtig eingelesen bekomme, wie könnte ich dann fortführend mit meinen Einstellparamatern (Art.Nr., Datum und Prüfmerkmal) einen Plot für das Nennmaß, USG, OSG und den Messwert erstellen`?


Dass die Beispieldatei am Anfang nicht dabei war, hat sicherlich das Verstehen meines Ausgangsproblems etwas erschwert. Hoffe, jetzt ist das ersichtlicher.

[EDITED, Jan, Bitte kein Top-Quotinmg der gesamten vorhergehenden Nachricht - Danke!]

Beispiel.xls
 Beschreibung:

Download
 Dateiname:  Beispiel.xls
 Dateigröße:  29.5 KB
 Heruntergeladen:  329 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.04.2017, 14:15     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Er macht die erste Zeile zur Überschrift, die eigentlichen Überschriften befinden sich allerdings in Zeile 3.

In der angehängten Datei sind die Überschriften doch in der ersten Zeile? Falls das in einer anderen Datei nicht der Fall ist, kann man über die 'Range' Option den einzulesenden Bereich angeben.

Zitat:
Außerdem versucht er mir die erste Spalte 'eindeutig' zu definieren und ändert dabei die Einträge ab, indem ein _1 durchlaufend nummeriert angehängt wird.

Wenn man RowNames verwenden möchte, ist das nun mal notwendig. Die naheliegende Lösung wäre, 'ReadRowNames', true wegzulassen.

Zitat:
Aus dem Matlab-Artikel geht für mich leider nicht ganz hervor, wie ich diese Sachen anpassen kann.

Falls du mit "Matlab-Artikel" die Doku des Befehls meinst: dort ist jede Option des Befehls beschrieben.

Zitat:
wie könnte ich dann fortführend mit meinen Einstellparamatern (Art.Nr., Datum und Prüfmerkmal) einen Plot für das Nennmaß, USG, OSG und den Messwert erstellen`?

Du hast ja schon einen Plot. Mir ist nicht klar, was du nun darüber hinaus machen möchtest.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 28.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.04.2017, 14:56     Titel:
  Antworten mit Zitat      
Hey Harald,
danke nochmal, dass du dir die Zeit nimmst. Habe nun ReadRowNames rausgenommen und die Range eingestellt (die Beispieldatei war diesbezüglich leider nicht ganz repräsentativ). Jetzt sieht die table auf jeden Fall so aus, wie sie soll, wobei ich mir da wohl noch Gedanken machen muss, wie ich ihm beibringe, dass die letzte zu einlesende Spalte abhängig vom Excel sheet sein soll.

Zu deiner letzten Frage:
Ich bekomme für jede KW so eine Excel-Datei. In diesen Dateien sind die Daten (wie in der Beispieldatei) aufgelistet. Dabei können in dieser KW verschiedene Artikel produziert und verschiedene Prüfmerkmale untersucht worden sein.
Ich möchte gerne Eckpunkte, wie Artikel-Nr., Datum und Prüfmerkmal dem Programm vorgeben können. Im Gegenzug möchte ich die Messwerte für genau diese Eckpunkte in einem Plot haben.
Beispiel: Ich möchte die Prüfergebnisse für das Gewicht am 24.03.17 des Artikels 123456. Matlab sucht sich aus der Excel-Datei alle die Zeilen, auf die das zutrifft und plottet mir das die Messwerte.

Der Stand aktuell ist, dass mir in einem Plot alle Messwerte, von allen Artikel für alle Prüfmerkmale für die gesamte Datei geplottet wird.
Hoffe, ich konnte das Ganze etwas besser erläutern


Gruß
nsj

[EDITED, Jan, Bitte kein Top-Quotinmg der gesamten vorhergehenden Nachricht - Danke!]
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.04.2017, 15:24     Titel:
  Antworten mit Zitat      
Hallo,

dann kannst du logische Indizierung verwenden. Wenn dein Table T heißt, dann
Code:
Tselect = T(T.Datum == ... & T.Artikel == ... , :)


Beim Vergleich von Zeichenketten strcmp statt == verwenden.

... und dann zum Plotten die entsprechenden Spalten aus Tselect holen.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 28.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2017, 00:13     Titel:
  Antworten mit Zitat      
Das hilft mir definitiv weiter, danke!
Mir ist dabei aufgefallen, dass ich nur nach Zahlen "suchen" kann, wie würde ich nach Zeichenfolgen selektieren können?
Private Nachricht senden Benutzer-Profile anzeigen
 
nsj
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 28.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2017, 12:31     Titel:
  Antworten mit Zitat      
Hey,
tut mir leid, dass ich da irgendwie auf dem Schlauch stehe.

Code:
PM = KN(KN.Pr_fmerkmal strcmp(Gewicht);

Wie muss ich das abändern? Neutral
Aus der Matlab-Doc für den Befehl werde ich gar nicht schlau. Ich verstehe daraus eigentlich nur, dass eine 1 oder 0 ausgegeben wird und mehr nicht.

-PM soll die das neue table heißen
-Aus KN soll er sich die sachen suchen
-Pr_fmerkmal heißt die Spalte, in der Gesucht werden soll
-Nach dem Merkmal Gewicht soll gesucht und ausgegeben werden

Code:
AN = import(import.Artikel_Nr_ == 1000003132, :)


Das klappt wunderbar. Aus import werden alle Artikel mit der Nummer 1000003132 gesucht und in AN geschrieben.
Danke dafür auf jeden Fall
Private Nachricht senden Benutzer-Profile anzeigen
 
nsj
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 28.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.04.2017, 21:31     Titel:
  Antworten mit Zitat      
Kann mir niemand helfen? Sad
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.448
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.04.2017, 08:32     Titel:
  Antworten mit Zitat      
Hallo,

bitte gedulde dich min. 24 Stunden mit Nachfragen.
http://www.gomatlab.de/der-kleine-gomatlab-de-knigge-t125.html
Gerade am Wochenende geht es hier nun mal ruhiger zu.

Vermutlich meinst du
Code:
PM = KN(strcmp(KN.Pr_fmerkmal, Gewicht), :);


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 18
Anmeldedatum: 28.03.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.04.2017, 11:03     Titel:
  Antworten mit Zitat      
Ja, da hast du natürlich recht. War da wohl etwas zu ungeduldig.
Dein Befehl funktioniert wie gewünscht. Vielen Dank!

[EDITED, Jan, Bitte kein Top-Quotinmg der gesamten vorhergehenden Nachricht - Danke!]
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.