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

Zeitraum eines Events auslesen

 

FReef
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2021, 18:03     Titel: Zeitraum eines Events auslesen
  Antworten mit Zitat      
Hallo zusammen,
ich stehe vor einem Problem, zu dem ich bisher keine passende Lösung gefunden habe.

Im Anhang findet ihr die Datei "data.mat". Diese hat Drei Spalten und wird über diesen Code-Abschnitt durch das Einlesen einer "Example.csv" Datei erzeugt:
Code:

%% INITIALIZE MATLAB
close all;
clc;
clear all;

%% Import CSV
data = readtable('Example.csv', 'delimiter', ';');

%Define t as time variable
t = data.Time;
 


Jetzt die zu lösende Aufgabe:
In der 2. Spalte "FocusedCandidates" sind alle Objekte aufgeführt, die beobachtet wurden durch ein Komma getrennt.
In der 3. Spalte "ClickedCandidates" wird angezeigt, ob ein Objekt ausgewählt wurde. Das Objekt wird immer nach Event_clicked from beschrieben. Im Beispiel sind das "Image(Joystick Right)" und "Button(2)(Propulsion)". Was dahinter steht ist nicht wichtig.

Die Aufgabe besteht jetzt darin zu untersuchen, wie lange das Objekt angeschaut wurde (in Spalte 2) bevor es ausgewählt wurde (In Spalte 3). Die dazugehörigen Zeitpunkte stehen in Spalte 1.
Es muss also die Beschreibung des ausgewählten Objekts gelesen werden und dann soll in den vorherigen Zeitschritten gesucht werden, ob dieses Objekt angeschaut wurde bis zu dem Zeitpunkt, wo das Objekt nicht mehr vorkommt.

Im Beispiel ist das bei "Image(Joystick Right)" der Zeitraum von t= 0.11 bis t= 0.35. Insgesamt also 0.35s - 0.11s = 0.24s.
Und für "Button(2)(Propulsion)" von t = 0.53 bis t = 0.65. Ergibt 0.12s.
Diese Zeiten möchte ich alle speichern und danach einen Durchschnittswert berechnen.

Ich hoffe die Aufgabe ist verständlich.
Vielen vielen Dank für eure Hilfe!!!!

data.mat
 Beschreibung:
data.mat Datei

Download
 Dateiname:  data.mat
 Dateigröße:  1.9 KB
 Heruntergeladen:  281 mal
Private Nachricht senden Benutzer-Profile anzeigen


FReef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.11.2021, 18:26     Titel:
  Antworten mit Zitat      
Kleiner Nachtrag:
Es reicht immer der Teil der Spalte 3 "ClickedCandidates" aus: ....Image(Joystick)... bzw. ...Button(2)...
Also das Wort nach "Event_clicked from" und das anschließende Wort in Klammern inkl. Klammern.
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: 10.11.2021, 09:26     Titel:
  Antworten mit Zitat      
Hallo,

was hast du denn genau versucht? Welche Probleme sind dabei aufgetreten?

Kann in einer Datei ein Objekt mehrfach angesehen werden, d.h. kann später nochmal ein Block z.B. mit Image(Joystick) kommen?

Die Zeilen mit den ClickedCandidates kannst du z.B. so finden:
Code:
find(string(data.ClickedCandidates) ~= '''-''')


Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
FReef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2021, 11:01     Titel:
  Antworten mit Zitat      
In der Datei können alle Objekte mehrfach angesehen werden. Image(Joystick) kann bspw. mehrfach vorkommen, sowie alle anderen Objekte auch.

Ich habe versucht die Beschreibung in ClickedCandidates zu extrahieren:
Code:

data = readtable('Example.csv', 'delimiter', ';');

%Define t as time variable
t = data.Time;

Clicked = data.ClickedCandidates;

Clicked = erase(Clicked, "-");
Clicked = erase(Clicked, ["Event _clicked from "]);
 


Danach wollte ich den String am delimiter ")" spliten, aber das geht nicht weil die anderen Zeilen, welche nur "-" enthalten diesen delimiter nicht vorweisen.
Ein Ersetzen von '''-''' in NaN)NaN oder ähnliches hilft auch nicht, da unterschiedlich viele ")" bei ClickedCandidates vorkommen.
Mit der Beschreibung, bsp. Image(Joystick, wollte ich dann die Suche in der Spalte FocusedCandidates starten.

Code:
find(string(data.ClickedCandidates) ~= '''-''')

gibt mir schonmal die gesuchten Zeilen aus, auf deren Inhalt ich zugreifen muss.

Gibt es die Möglichkeit eine if-Schleife in etwa so aufzubauen:

Code:
for n=1:1:end
  if "ClickedCandidates" ~= '''-'''
     Bearbeite Zeile mit erase(Clicked, ["Event _clicked from "]); und Clicked = split(Clicked, ")");
     Lese diese k-te Zeile aus
     for i=k:-1:1
        Suche in den vorherigen Zeilen in der Spalte "FocusedCandidates" nach der Beschreibung.
        Beende die Schleife, wenn die Beschreibung nicht mehr gefunden wird.
        Gebe diesen j-ten Wert der Zeile aus.
     end
  end
Subtrahiere j-ten Wert in "Time" von k-tem Wert und speichere die Zahl.
end


Oder gibt es schönere Möglichkeiten? Danke für die Hilfe!
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: 10.11.2021, 11:33     Titel:
  Antworten mit Zitat      
Hallo,

den Pseudo-Code hinzuschreiben ist doch fast mühsamer als den eigentlichen Code?

Vorschlag:
Code:
lastRows = find(string(data.ClickedCandidates) ~= '''-''');
for k = 1:numel(lastRows)
    idx = lastRows(k);
    Clicked = erase(data.ClickedCandidates(idx), "Event _clicked from ");
    Clicked = extractBefore(Clicked, ")") + ")";
    startRows(k) = find(~contains(erase(data.FocusedCandidates(1:idx-1)," "), erase(Clicked, " ")), 1, "last")+1;
end
data.Time(lastRows) - data.Time(startRows)


Ob das nun so für vermutlich längere und vielleicht viele Dateien funktioniert oder ob es da weitere Sonderfälle gibt, muss sich zeigen.

Generell würde ich versuchen zu sehen, ob das Datenformat verbessert werden kann.
Spätestens die unterschiedliche Leerzeichensetzung bei "Image (Joystick Right)" zwischen "Image" und "(" erscheint absurd. Ich habe mir damit beholfen, die Leerzeichen einfach rauszuschmeißen.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
FReef
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 11.10.21
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.11.2021, 13:11     Titel:
  Antworten mit Zitat      
Vielen Dank Harald!

Der Code funktioniert super!
Ich musste lediglich die erste Zeile aus meiner Datei löschen, da diese keinen Inhalt enthält, da habe ich immer einen Fehler bekommen "invalid Input...".
Funktioniert jetzt auch für meine Dateien mit ca. 20000 Zeilen.

Mega gut, ich bin total happy und hab wieder viel gelernt!
Beste Grüße
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: 10.11.2021, 13:55     Titel:
  Antworten mit Zitat      
Hallo,

meine Empfehlung wäre, sich mal ein Histogramm der Zeiten anzusehen. Es kann ja durchaus sein, dass es da Ausreißer gibt, die das Bild sehr verzerren. Dann können median oder trimmean geeigneter sein.

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.