Verfasst am: 19.08.2014, 16:00
Titel: Klassifizierung von Messdaten und übertragen in ein Kennfel
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!
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.
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
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.
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
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;
% 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")
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
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 = [1200130014001500160017001800] for Drehmoment = [-20002004006008001000] ... hier der Code für eine Drehzal und ein Drehmomemt
end end
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?
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
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
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
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.
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.
Hiermit erhalte ich zumindest fast das, was gewüsncht wäre. Bis ich dahin komme, dauert es wohl noch ein Stück
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!
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.