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

Klassifizierung von Messdaten und übertragen in ein Kennfel

 

sexyphil
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 19.08.14
Wohnort: Bayern
Version: 2013a
     Beitrag Verfasst am: 19.08.2014, 16:00     Titel: Klassifizierung von Messdaten und übertragen in ein Kennfel
  Antworten mit Zitat      
Hallo,

ich habe ein Messfile mit 2 Kanälen (Drehzahl, Druck). Das File hat ca. 161576 Zeilen.
Ich benötige nun eine Anzahl div. Drehzahlen und Drücke in einem bestimmten Bereich.
Ich möchte meine Drehzahl die von 0-3383(im Maximum) geht in 51 Klassen aufteilen. Dies habe ich mit "class_n=linspace(min_n,max_n,51)" versucht zu realisieren. Dabei kommt sowas raus wie [25 92,16 159,3 ...]. Das ist meine Klasseneinteilung. Das gleiche habe ich für den Druck gemacht. Jetzt habe ich eine Matrix zur Verfügung in deren ersten Spalte meine Drehzahl steht und in der zweiten mein Druck. Nun möchte ich ein Kennfeld erstellen. In Zeile 1 und Spalte 1 soll nun stehen wie oft "passiert es", dass meine Drehzahl zwischen 25 und 92,16 ist und gleichzeitig mein Druck in einem bestimmen Fenster liegt.
Mit einer größer gleich & kleiner gleich Vorgehensweise für jede einzelne Zeile würde ich schon hinkommen, allerdings benötigt man dann sehr sehr viele Zeilen. Letzendlich gibt es für jeden Drehzahlbereich auch 51 Druckbereiche. Ich hoffe meine Erklärung ist einigermaßen verständlich.
Ich vermute man kann es mit for-Schleifen realsieren, allerdings fehlt mir leider ein bisschen das "Vokabular" hierfür. Danke!
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 20.08.2014, 09:10     Titel:
  Antworten mit Zitat      
Hallo,

eigentlich möchtest du soetwas wie ein zweidimensionales Histogramm machen?
Du erstellst eine 51x51-Matrix aus Nullen, in das du dann die Häufigkeiten hinschreibst:

Das geht natürlich mit zwei geschaltelten Schleifen, je eine über die Bins. Für jede Bin-Kombination zählst du dann die Zeilen, die in dieses Bin fallen und schreibst den Wert an die Stelle der Matrix.

Alternativ geht das auch mit einer Schleife: und suchst in einer schleife für jede Zeile das passende Drehzahl- und das passende Druck-Bin heraus und addierst dort in der Matrix an der Stelle eine 1.

Das sollte auch nicht wirklich lange dauern für 161 Tausend Zeilen. Falls es doch zu lange dauert, kann man da etwas ausgefuchstes mit accumarray() machen, was dann komplett vektorisiert ist.

Oder einfach mal nach 2d histogram, hist2d, ... etc googlen.

Viele Grüße,
Nras.
Private Nachricht senden Benutzer-Profile anzeigen
 
sexyphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 19.08.14
Wohnort: Bayern
Version: 2013a
     Beitrag Verfasst am: 20.08.2014, 10:45     Titel:
  Antworten mit Zitat      
Hallo Nras,

vielen Dank für deine Hilfe. Ich bin jetzt auf den Befehl "hist3" gestoßen durch deine Antwort. Ich hätte es schade gefunden, ein gemachtes Skript zu verwenden, weil ich eigentlich gerne etwas dazu gelernt hätte. Aber da der hist3 Befehl nun mal zur Matlab Sprache gehört bin ich befriedigt Wink

Nochmals vielen Dank für den Denkanstoß!
Private Nachricht senden Benutzer-Profile anzeigen
 
sexyphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 19.08.14
Wohnort: Bayern
Version: 2013a
     Beitrag Verfasst am: 13.03.2015, 13:10     Titel:
  Antworten mit Zitat      
hallo,

Ich müsste dieses Thema hier nochmal aufgreifen.

Ich habe folgendes Szenario:


Lastwechsel Drehzahl Drehmoment
0,161058813 1530,25 653,6
13,00092765 1551,75 651,6
26,00379504 1569,5 644,6
39,20480754 1599,25 639,2
52,63132117 1623,5 676,6
66,27601267 1651,75 842,8
80,22121404 1695,5 934
94,5259304 1738,25 946,4
109,1752139 1778 947,4
124,001263 1780,75 -6
137,2322143 1395,25 -103,2
148,1598509 1227,75 -96,2
158,2873969 1203,25 956,4
168,4036888 1225 965,2
178,6957918 1245,5 966,8
189,1453703 1262,75 966,4
199,7478403 1282,25 966,4
210,5005014 1298,75 966,2
221,3989754 1317,25 1000

Ein Histogramm von der Verteilung der Häufigkeiten von Drehzahl und Drehmoment stellt mit dem
Code:
Befehl kein Problem dar.
Allerdings muss ich in einem 3D-Histogramm die Verteilung der Lastwechsel über Drehzahl und Drehmoment darstellen.

Sagen wir die Klassengrenzen für Drehzahl seien [1200 1300 1400 1500 1600 1700 1800] und die für das Drehmoment [ -200 0 200 400 600 800 1000].

Die Lastwechsel sind aufsummiert, d.h. bei der ersten Aufnahme der Messdaten in der 1. Zeile habe ich 0,16 Lastwechsel in der Klasse [1500 - 1600] bei Drehzahl und [600 - 800] bei Drehmoment. Jetzt soll quasi in eine Matrix (die durch die Klassen zu einem 2D Histogramm aufgezogen wird) der Wert 0,16 geschrieben werden. Die zweite Zeile befindet sich in den gleichen Klassen ergo soll zu den 0,16 Lastwechseln die 13 Lastwechsel dazu addiert werden.

Sodass man am Ende einen Überblick hat wie viele Lastwechsel habe ich bei bestimmten Druck und Drehzahl.

Leider komm ich mit der Erklärung von
Code:
auf Englisch nicht ganz klar und habe fast die Vermutung, dass ich hierfür selber eine Schleife programmieren muss?
Private Nachricht senden Benutzer-Profile anzeigen
 
sexyphil
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 19.08.14
Wohnort: Bayern
Version: 2013a
     Beitrag Verfasst am: 16.03.2015, 19:55     Titel:
  Antworten mit Zitat      
Ich habe jetzt mal mit folgender Schleife mein Problem gelöst. Siehe unten.
Allerdings, wie man sicher merkt, müsste ich das jetzt 77x44 mal kopieren und die Grenzen ändern.

Hat jemand einen Lösungsvorschlag, wie man das ganze gestalten kann ohne jedes Intervall manuell eingeben zu müssen?

Man kann sich ja auf die Klassifizierungsvektoren beziehen in der Form

Code:
G(i,1) < class_M(1,1)


das ganze soll später aber mal variabel sein, sodass die Grenzen nicht immer dem Vektor 'class_m' entsprechen.

Hier mal mein Code
Code:

clear s
loadcycles=cumtrapz(time_7,is1_eng_speed_7); %Lastwechsel bzw. Umdrehungen die der Motor macht
loadcycles=loadcycles/60;
class_M=[-900:50:1000]; % Intervall für Drehmoment
class_N=[500:50:2200];  % Intervall für Drehzahl
G=[can_trq_dem_7 is1_eng_speed_7]; % Matrix mit Drehmoment und Drehzahl
M=zeros(77,44); % Matrix für das Kennfeld
s=0;

for i=1:length(G);
   
     % Wenn Wert der Zeile 'i' zwischen 675Nm und 650Nm liegt & zwischen 1500 U/min und 1550 U/min
     % dann addiere die Lastwechsel ("die vom Motor gemachten Umdrehungen in dieser Zeit")
   
     if G(i,1) < 675 && G(i,1) > 650 && G(i,2) < 1550 && G(i,2) > 1500
        s=loadcycles(i)+s;                                          
       
    end
   
end

s_neu=s/loadcycles(end);        


Über jeden Verbesserungsvorschlag würde ich mich freuen!
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: 17.03.2015, 13:14     Titel:
  Antworten mit Zitat      
Hallo sexyphil,

Ich verstehe dir Frage noch nicht.

Zitat:
Ich habe folgendes Szenario:

Das "Szenario" ist eine Tabelle von Zahlen, die sich wegen des Kommas nicht per Copy&Paste in Matlab einfügen lassen. Als Leser kann man damit erst mal überhaupt nichts anfangen.

Zitat:
Ein Histogramm von der Verteilung der Häufigkeiten von Drehzahl und Drehmoment stellt mit dem
Code:
Befehl kein Problem dar.
Allerdings muss ich in einem 3D-Histogramm die Verteilung der Lastwechsel über Drehzahl und Drehmoment darstellen.

Poste doch mal Deinen HIST3-Befehl und erklären, wieso Du das nicht einfach auch für Deine Aufgabe verwenden kannst. Was ist Dir denn bei dem Help-Text unklar? Der ist nämlich eigentlich umfassend und erklärt alle Details hinreichend genau.

Zitat:
Sagen wir die Klassengrenzen für Drehzahl seien [1200 1300 1400 1500 1600 1700 1800] und die für das Drehmoment [ -200 0 200 400 600 800 1000].

Du könntest den Code also einfach in zwei FOR-Schleifen über diese Vektoren packen, oder?
Code:
for Drehzal = [1200 1300 1400 1500 1600 1700 1800]
  for Drehmoment = [ -200 0 200 400 600 800 1000]
    ... hier der Code für eine Drehzal und ein Drehmomemt
  end
end
 


Zitat:
Die Lastwechsel sind aufsummiert, d.h. bei der ersten Aufnahme der Messdaten in der 1. Zeile habe ich 0,16 Lastwechsel in der Klasse [1500 - 1600] bei Drehzahl und [600 - 800] bei Drehmoment.

Das ist für mich deutlich zu kompliziert. Aber für Dich ist das soweit klar, also wird es für die eigentliche Frage nicht benötigt, oder?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 19.08.14
Wohnort: Bayern
Version: 2013a
     Beitrag Verfasst am: 17.03.2015, 18:54     Titel:
  Antworten mit Zitat      
Hallo,

danke schon mal für die erste Idee.

Ich habe mal die ersten Zeilen meines Messfiles angehängt. In Spalte 1 sind die Messwerte für Drehmoment, in Spalte 2 die für Drehzahl und in Spalte 3 sind die Lastwechsel bzw. die Umdrehungen die der Motor ab Anfang der Messfahrt macht. Wäre das File die ganze Messfahrt hätte der Motor also insg. 7.45 Umdrehungen gemacht.

Die Idee mit den Vorschleifen, hat mir heute auch ein Kollege empfohlen. Es klingt aber fast so als würde es mit
Code:
doch klappen?

Ich habe folgendes probiert

Code:

loadcycles=cumtrapz(Zeitvektor,Vektor_Drehzahl);
loadcycles=loadcycles/60;
min_M=min(Vektor_Drehmoment);
max_M=max(Vektor_Drehmoment);
class_M_interv=25;
class_M=[min_M:class_M_interv:(max_M+class_M_interv)];
min_N=min(Vektor_Drehzahl);
max_N=max(Vektor_Drehzahl);
class_N_interv=50;
class_N=[min_N:class_N_interv:(max_N+class_N_interv)];
class={class_M class_N};
G=[Vektor_Drehmoment Vektor_Drehzahl ;
[X,Y]=hist3(G,class);
 


Damit erhalte ich in Y genau mein 'class' Cell Array wieder und in X die Häufigkeiten, wie oft befinden sich bestimmte Drehzahlen und Drehmomente in welchem Intervall. Anstatt in der Matrix X die Häufigkeiten einzutragen, müsste ich die Summe der Lastwechsel, die zu den entsprechenden Zeilen im File gehören, eintragen.

In meinem Beispiel File wäre das folgendermaßen:

Drehmoment liegt immer zwischen 650Nm und 700Nm (bei gegebenem Intervall von 50Nm) und die Drehzahl zwischen 1500U/min und 1550U/min. Jetzt müsste quasi in die Zelle in der Matrix, welche beide Klassen betrifft die Summe der dritten Zeile (loadcycles) als Wert geschrieben werden. Also

0 + 0.2546 + 0.51 + 0.7658 + 1.0211 + ...

Ich hoffe jetzt ist es klar?

Gruß
Philipp

messdaten.zip
 Beschreibung:
Messfile

Download
 Dateiname:  messdaten.zip
 Dateigröße:  618 Bytes
 Heruntergeladen:  373 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: 18.03.2015, 12:50     Titel:
  Antworten mit Zitat      
Hallo sexyphil,

Zitat:
Drehmoment liegt immer zwischen 650Nm und 700Nm (bei gegebenem Intervall von 50Nm) und die Drehzahl zwischen 1500U/min und 1550U/min. Jetzt müsste quasi in die Zelle in der Matrix, welche beide Klassen betrifft die Summe der dritten Zeile (loadcycles) als Wert geschrieben werden. Also

0 + 0.2546 + 0.51 + 0.7658 + 1.0211 + ...

Ich hoffe jetzt ist es klar?

Ich finde keine dieser Zahlen in den Daten. Beziehst Du Dich auf die Werte, die Du in http://www.gomatlab.de/klassifizier.....nnfeld-t34572.html#146841 angegeben hast?

Für die Berechnung von Summen über Bereiche ist ACCUMARRAY geeignet. Ich finde aber nach wie vor, dass dieser Befehl den verwirrendsten Hilfe-Text hat. Dies liegt wohl daran, dass der Befehl extrem mächtig ist.
Ich habe den Eindruck, die beiden FOR-Schleifen könnten das Problem schneller lösen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 19.08.14
Wohnort: Bayern
Version: 2013a
     Beitrag Verfasst am: 18.03.2015, 13:37     Titel:
  Antworten mit Zitat      
Hey Jan,

nein die Daten sind in dem Messfile zu finden, welches ich angehängt habe.

Ja das mit dem ACCUMARRAY hab ich auch schon mal versucht nachzuvollziehen, aber ich scheiter immer an dem Englischen und dem Verständnis.

Bei deiner vorgeschlagenen For-Schleife versteh ich nicht ganz, was dann das Ergebnis ist?

Code:

for Drehzal = [1200 1300 1400 1500 1600 1700 1800]
  for Drehmoment = [ -200 0 200 400 600 800 1000]
    ... hier der Code für eine Drehzal und ein Drehmomemt
  end
end


Ich brauche ja nicht eine bestimmte Drehzhal und ein bestimmtes Drehmoment sondern alle Drehzahlen und Drehmomente die in einem Bereich sind. Die Bereiche sind z.B. das Intervall 1200 U/min und 1300U/min (wie in deinem Vektor oben). Das nächste Intervall wäre dann 1300U/min bis 1400U/min. Zu diesen Intervallen brauche ich wiederrum alle Drehmomentbereiche.
Ich werde wohl eine äußere Schleife und eine innere Schleife benötigen leider bekomme ich das einfach nicht schön und einfach hin.
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: 19.03.2015, 12:05     Titel:
  Antworten mit Zitat      
Hallo sexyphil,

Wie wäre so etwas:
Code:

Drehzahl = [1200 1300 1400 1500 1600 1700 1800];
Drehmoment = [ -200 0 200 400 600 800 1000];
n_DZ = length(Drehzal) - 1;
n_DM = length(Drehmoment) - 1;
Result = zeros(n_DZ, n_DM);
for dz = 1:n_DZ
  for dm = 1:n_DM
    Result(dz, dm) = sum(Daten >= Drehzahl(dz) && Daten < Drehzahl(dz+1));
  end
end

Und dann noch das Kriterium für das Drehmoment anfügen.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 19.08.14
Wohnort: Bayern
Version: 2013a
     Beitrag Verfasst am: 24.03.2015, 15:51     Titel:
  Antworten mit Zitat      
Hallo Jan,

mit deiner Variante habe ich immer einen Memory Fehler bekommen :/

Ein Kollege hat mich auf die Idee gebracht mit Index zu arbeiten.

Code:

loadcycles=cumtrapz(time_7,is1_eng_speed_7);
loadcycles=loadcycles/60;
min_M=min(can_trq_dem_7);
max_M=max(can_trq_dem_7);
class_M_interv=25;
class_M=[min_M:class_M_interv:(max_M+class_M_interv)];
min_N=min(is1_eng_speed_7);
max_N=max(is1_eng_speed_7);
class_N_interv=50;
class_N=[min_N:class_N_interv:(max_N+class_N_interv)];
G=[can_trq_dem_7 is1_eng_speed_7];
numloads=sum(loadcycles);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:length(class_N)-1
   
    indN=(G(:,2)>=class_N(k) & G(:,2)<class_N(k+1));
 
    for kk=1:length(class_M)-1
       
        indM=(G(:,1)>=class_M(kk) & G(:,1)<class_M(kk+1));
        ind=indM.*indN.*loadcycles; %./numloads;
       
        M(k,kk)=sum(ind);
    end
end

[Nmesh,Mmesh]=meshgrid(class_N(1:end-1)+25,class_M(1:end-1)+12.5);

surf(Nmesh,Mmesh,M');


Hiermit erhalte ich zumindest fast das, was gewüsncht wäre. Bis ich dahin komme, dauert es wohl noch ein Stück Wink

Habe das Problem, dass meine Drehmomentwerte auch negativ sind und somit hab ich versucht mit zwei if-Schleifen zu arbeiten. Leider hat das auch noch nicht geklappt. Ich melde mich wieder, wenn ich weitergekommen bin.

Aber hier schon mal ein Vorschlag wie es funktionieren könnte.

Und ein Danke an dich Jan für die Hilfe!
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.