Verfasst am: 10.06.2015, 08:58
Titel: Zuordnung und Zeitintervall
Hallo,
ich bin neu hier und ich hoffe, dass mir hier geholfen werden kann. Hab nach ähnlichen Threads hier gesucht und leider nichts gefunden, deshalb habe ich mich hier angemeldet und erstelle nun diesen Thread.
Ich hab eine Matrix mit drei Spalten. Links habe ich immer einen Abstand (zwischen -200 und 200), in der Mitte die Zeit und rechts die Objekt-ID zu dem die Zeit und der Abstand immer gehören. Ich will nun ein Script erstellen, wo mir automatisch in einer 4. Spalte oder in einem neuen Vektor angezeigt wird, wie weit die Abstände dieser Objekte von Null entfernt sind.
Das Obejkt, das am nächsten Null dran ist vom Abstand her soll eine "1" kriegen, das was am zweitnächsten rankommt soll eine "2" kriegen usw. Die negative Zahl, die am nächsten an Null dran ist soll eine "-1" kriegen und dann usw. Dann habe ich also lauter Zahlen wie 1,2,4,-5 etc. in einer Spalte stehen und sehe so direkt wer am nächsten an Null dran ist.
Zusätzlich soll alle 10 Sekunden eine neue Zuordnung gemacht werden. Die Abstände der Objekte ändern sich mit der Zeit. Objekt X ist vielleicht am ANfang nur 10 Meter von Null entfernt, aber nach 10 Sekunden sind es 50 Meter und es muss diesem Objekt eine neue Zahl zugewiesen werden. Vorher hatte es vielleicht die "1", jetzt aber die "3" oder was auch immer. Bei diesem Problem tue ich mich schwer. Hab mir überlegt das vielleicht mit einem Timer-Objekt zu machen, aber da fehlt mir leider die Erfahrung bei sowas. Vielleicht geht das auch viel einfacher.
Den ersten Punkt müsste man wohl mit einer Schleife machen, aber wie genau diese aussehen soll weiß ich noch nicht, vor allem nicht wie ich es machen soll, dass in der Schleife alle 10 Sekunden dann eine neue Zuordnung gemacht werden soll.
Ich hoffe ich konnte mein Problem gut schildern und über Hilfe würde ich mich sehr freuen.
konkrete Beispieldaten und die erwarteten Ergebnisse dafür würden es deutlich erleichtern.
Mit sort und dem zweiten Rückgabeargument sollte das jedenfalls machbar sein. Geschickt dürfte es sein, die positiven und negativen Abstände getrennt zu sortieren.
Wie werden diese Änderungen, die alle 10 Sekunden passieren, in MATLAB überhaupt erfasst oder dargestellt?
Danke schon mal für deine Antwort. Die Matrix hat mehr als 10.000 Zeilen, deshalb kann ich sie hier nicht posten. Hier mal ein Beispiel, damit man sich das vorstellen kann:
Wie gesagt sind in der linken Spalte die Abstände (negativ bedeutet, dass das Objekt hinter einem ist, positiv vor einem und wir selbst sind quasi die Null, deshalb interessiere ich mich dafür, wer am nächsten an Null, also mir dran ist), in der Mitte die Zeit in Sekunden und rechts die Objekt-ID. Man sieht deutlich, dass Objekt 187 am Anfang noch 59 Meter hinter mir war und nach 4 Sekunden nun 15 meter vor mir ist. Die Abstände der Objekte ändern sich also mit der Zeit. Deshalb möchte ich nach einer definierten Zeit einen Schnitt machen und eine neue Zuordnung machen. Kann man sich wie ein Foto vorstellen: Ich mache ein Foto von der momentanten Siatuation und gucke welches Objekt wie weit entfernt ist und stelle es durch Zahlen dar (1 ist am nächsten an Null dran usw.). Dann lasse ich 10 Sekunden vertreichen und mache wieder ein Foto und schaue, welches Objekt nun am nächsten dran ist usw. Die Abstände ändern sich ja mit der Zeit.
Wie genau die Änderungen, die alle 10 Sekunden passieren in Matlab dargestellt werden sollen weiß ich ehrlich gesagt noch nicht. Das ist auch ein Grund für den Thread hier.
Kannst du mir bitte sagen, wie genau das mit sort aussehen soll? Also jetzt mal am Beispiel meiner Matrix. Und wie kann ich geschickt die negativen Zahlen von den positiven trennen und dann darstellen?
als .mat-Datei sollte sich auch ein Datensatz mit 10000 Zeilen anhängen lassen. 4 Zeilen sind jedenfalls zu wenig, um das Muster zu erkennen.
Insbesondere: man sollte doch die Abstände zum gleichen Zeitpunkt vergleichen? Die Zeit scheint aber kontinuierlich durchzulaufen. Woher weiß man also, ob Objekt 187 zur Zeit 1 oder 4 mit Objekt 213 verglichen werden soll?
Erklärung dazu:
Bei Sekunde 1:
Objekt 187 hat Abstand -59
Objekt 213 hat Abstand -13
Objekt 15 hat Abstand -66
Objekt 195 hat Abstand 15
Bei Sekunde 2:
Objekt 187 hat nun Abstand -13
Objekt 213 hat nun Abstand 5
Objekt 15 hat nun Abstand -23
Objekt 195 hat nun Abstand 55
Man sieht also deutlich, wie nach einer Sekunde die Objekte (z.B. Objekt 187,213) von hinten der Null näher kommen und wie andere Objekte (z.B. Objekt 195) sich von der Null entfernen.
Den Moment bei einer Sekunde will ich nun festhalten und will den Objekten Zahlen geben, je nachdem wie nah sie an der Null dran sind. Objekt 15 hätte dann also die "1", Objekt 213 die "-1", Objekt 187 die "-2" und Objekt 15 die "-3". Nach einer Sekunde ändern sich aber die Abstände und ich möchte dann eine neue Zuordnung haben usw.
Kannst du deinen Code bitte noch ein wenig erklären? Hab ihn noch nicht ganz durchschaut.
Ich hätte vielleicht auch erwähnen sollen, dass ich ganz neu bin was Matlab angeht und deshalb war ich von deinem Code auch ein wenig überfordert am Anfang. Bin den Code nun durchgegangen:
Also klar, zuerst erstellen wir eine Matrix, die wir als M bezeichnen. In der 2. Zeile nimmst du dann als Werte aus der 1. Spalte und definierst sie als col1. Die 3. Zeile verstehe ich dann nicht ganz. Also col1 soll größer als 0 sein und das definieren wir als pos? Wenn ich das in Matlab so eingebe, dann kommt eine Spalte mit [0 0 0 1 1]. Die negativen Werte werden also mit diesem Befehl 0 gemacht und die positiven zu 1?
In Zeile 4 und 5 trennst du die positiven und negativen Werte voneinander, wenn ich das richtig verstehe und erstellst eine neue 2x2 Matrix. Rechts ist dann auch die Zahl, die ich haben will, also nächste Zahl an der Null soll die "1" kriegen usw.
Bei der Matrix [a2, b2] ist aber wohl ein Fehler, weil da müsste eigentlich die -13 die Zahl "1" kriegen, da sie näher an der Null ist als die -59. Später wird es aber irgendwie wieder richtig, komisch.
In Zeile 6 und 7 findet man dann direkt die Stelle von den positiven bzw. negativen Werten.
In Zeile 8 erstellst du eine 4. Spalte in der Matrix M und definierst sie als Null. Die zwei Zeilen danach verstehe ich dann aber nicht ganz, also die Syntax macht mir Probleme. Die Funktion numel kenne ich nicht und weiß noch nicht, wie man da auf die zwei Zeilen kommt, aber zumindest kommt das richtige dabei raus. Danke nochmal für deine große Hilfe.
Die 3. Zeile verstehe ich dann nicht ganz. Also col1 soll größer als 0 sein und das definieren wir als pos? Wenn ich das in Matlab so eingebe, dann kommt eine Spalte mit [0 0 0 1 1]. Die negativen Werte werden also mit diesem Befehl 0 gemacht und die positiven zu 1?
Diese Technik heißt logical indexing, bitte mal einlesen.
Zitat:
Bei der Matrix [a2, b2] ist aber wohl ein Fehler, weil da müsste eigentlich die -13 die Zahl "1" kriegen, da sie näher an der Null ist als die -59. Später wird es aber irgendwie wieder richtig, komisch.
Das ist kein Fehler, sondern ein Zwischenergebnis. Bitte mal die Doku von sort lesen.
Grundsätzlich ist es sicher angenehmer, sich systematisch (Getting Started der Doku, MATLAB Onramp) einzuarbeiten als sich von Problem zu Problem zu hangeln.
Okay Danke, werde ich machen. Eine kleine Frage noch: Wie kriege ich es nun hin, dass alle 10 Sekunden eine neue Zuordnung gemacht werden soll bzw. wie könnte man das elegant darstellen? Die richtigen Zahlen werden momentan zugewiesen, aber nach 10 Sekunden hätte ich dann gerne neue Zahlen für die Objekte.
aber nach 10 Sekunden hätte ich dann gerne neue Zahlen
Was genau heißt das? Aufspalten in [0, 10], ]10, 20], ]20, 30], ... ?
Ein etwas größerer Datensatz und die genaue gewünschte Unterteilung wäre hilfreich.
Hab mich jetzt auch ein wenig in Matlab eingearbeitet und kann mein Problem näher erklären. Die Spalten 1-8 stehen für die ganzen Objekt-IDs und die Zeilen für die Zeit in Sekunden. Ich hab also einen Scanner und dieser scannt die Objekte. Nach drei Sekunden scannt er neu und den Objekten werden diese Zahlen geordnet, die mit dem Code weiter oben ermittelt worden. Also -1 bedeutet, dass es das nächste Objekt vor mir ist, die 1 ist das nächste Objekt vor mir usw. Nach 6 Sekunden wird dann wieder gescannt, die Objekte bewegen sich und kriegen dementsprechend neue IDs.
Nun zu meinem Problem: Der Scanner scannt nicht immer alle 3 Sekunden, sondern eben unterschiedlich. Bei der Beispielmatrix oben sind es zuerst nach 3 Sekunden, dann wieder nach 3 Sekunden und dann nach 4 Sekunden. In meiner echten Matrix sind diese Intervalle eben auch so unterschiedlich. Zwischen 3-10 Sekunden ist alles dabei.
Es soll auch so dargestellt werden, dass wenn immer der Scanner neu scannt, dass dann die Zeile mit den Zahlen ausgefüllt wird je nachdem wie weit weg sie sind von einem. Dazwischen sind dann immer die NaNs. Also so wie es oben dargestellt ist, so soll es auch am Ende aussehen. Immer wenn der Scanner scannt soll jedem Objekt eine Zahl zugeordnet werden und dann kommen die NaNs. Wird dann neu gescannt, dann wieder den Objekten Zahlen geben und in diesem Intervall dann wieder NaNs bis neu gescannt wird usw.
Da sieht man, dass der Scanner z.B. nach 7 Sekunden drei Sekunden Pause gemacht hat und nach 10 Sekunden dann neu gescannt hat. Nach 12 Sekunden sind es dann 5 Sekunden Pause usw. Die Intervalle ändern sich also. In dem Vektor oben könnte ich dann so theoretisch die Zyklen festlegen. Ich Könnte es ja so machen, dass wenn die Differenz zum nächsten Zeitpunkt mehr als 3 beträgt, dass dann ein neuer Zyklus starten soll, oder nicht? So grob gedacht müsste ich das wohl mit den Differenzen innerhalb einer Schleife machen.
Über Hilfe würde ich mich sehr freuen. Ich hoffe ich konnte das gut darstellen, ansonsten einfach nachfragen.
Die Zahlen variieren zwischen 150 bis -150 und es sind auch viele NaNs dabei, da bestimmte IDs zu bestimmten Zeitpunkten nicht da waren bzw. nicht erfasst werden konnten.
Die Matrix oben hat also die Länge vom Zeit- und ID-Vektor und ich möchte sie nun mit den Zuordnungen füllen:
Erstmale erstelle ich die Matrix "Sortiert" mit genau der selben Länge und fülle sie mit NaNs:
Nun gehts an die Zuordnungen. Zeile für Zeile soll die Matrix darauf untersucht werden, welches Objekt näher an die Null dran ist. Wenn man sich also die erste Zeile von der Matrix "Abstand anguckt, dann ist die ID mit 4 Meter Abstand am nächsten an der Null dran, bekommt also die Zahl "1", danach kommt die ID mit 6 Meter Abstand und bekommt die Zahl "2" usw. Die IDs mit den negativen Abständen bekommen negative Zahlen, also die ID mit -15 Meter Abstand bekommt die "-1" und die ID mit -90 Meter Abstand bekommt die "-2" usw. Da wo ein NaN ist soll auch wieder ein NaN stehen.
Wenn also die Matrix "Abstand" sortiert wird, dann muss das so aussehen:
So sieht man dann direkt, wie sich die IDs mit der Zeit (also den Zeilen entsprechend nach unten) verändern. Manche Objekte werden zum nächsten Zeitpunkt nicht erfasst und kriegen ein NaN, andere kommen der Null näher oder entfernen sich davon.
Ich hab noch versucht den Code von Harald anzupassen, aber ich kriege es leider nicht hin. Beim Code von Harald ist das Ganze noch eindimensional, es wurde also nur ein neuer Vektor als 4. Spalte erstellt. Jetzt soll es aber zweidimensional werden und die Matrix "Abstand" mit der Länge Zeitvektor und ID-Vektor soll in jedem Punkt einfach nur mit den Zuordnungen überschrieben werden und da brauche ich denke ich eine Schleife, um die Matrix Zeile für Zeile durchzugehen und zu sortieren, oder nicht? Also meine Idee wäre eine Schleife zu bilden und dadrin die Zeilen zu sortieren und sie dann zuzuordnen. Das geht man dann Zeile für Zeile durch. Mir fällt es nur schwer meine Idee in einem Code umzuwandeln. Ich würde mich über Hilfe sehr freuen.
letztlich musst du also für jede Zeile das machen, was ich dir beschrieben hatte, und das wieder in die Zeile der neuen Matrix schreiben. Für das Beispiel:
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.