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

NaN Vektor an beliebiger Stelle(i) in Datenmatrix einfügen

 

LiGa
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2013, 08:58     Titel: NaN Vektor an beliebiger Stelle(i) in Datenmatrix einfügen
  Antworten mit Zitat      
Hallo zusammen,

ich versuche mittels MatLab Daten von graphomotorischen Tests auszuwerten. Das zur Datenerfassung verwendete Tablet liefert eine (mx6)Datenmatrix. Da bei der Schriebbewegung immer wieder abgesetzt wird, entstehen Sprünge (es wird nicht kontinuierlich aufgezeichnet, sondern nur wenn die Pen im aktiven Bereich ist) --> siehe Zeile 1103/1104

Code:

1102    12,1945000000000
1103    12,1946500000000
1104    14,2320400000000
1105    14,2431400000000


Nach genau diesen Sprüngen möchte ich in meiner Matrix eine Zeile NaN einfügen und alle anderen Zeilen nach unten verschieben, um die Bewegungen separieren zu können.

Irgendwie funktioniert das aber nicht so richtig.
Mit dieser Funktion wird logischerweise immer eine Zeile in der Matrix überschrieben, was unerwünscht ist.

Code:
function [Delta] = DetectInterrupt(Delta,Threshold)
% if delta>threshold movement is interrupted --> pen not on display
% --> set value NaN to seperate movements
  for i=1:length(Delta)-1
    if (Delta(i+1,2)-Delta(i,2)>Threshold)
       Delta(i+1,1)=NaN;
    end
  end
end


und hier stimmt irgendetwas mit den Dimensionen nicht, aber ich kann leider meinen eigenen Fehler nicht finden (denke offensichtlich im Kreis).

Code:
DetectDelta = find(PenData>DeltaTMax);
AA=zeros(size(TimeDelta)+size(DetectDelta),1);
j=1:length(TimeDelta);

for i=1:length(AA)
    if TimeDelta(j,2)<DeltaTMax
        AA(i)=TimeDelta(j,1);
    else
        AA(i)=NaN;
    end
    j=j+1;
end


Ich bitte um eure Hilfe. Vielleicht (hoffentlich) hat jemand einen bessern Lösungsvorschlag!

mfg Lisa
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.05.2013, 17:43     Titel:
  Antworten mit Zitat      
Hallo Lisa,

so:
Code:
index = cumsum(([0; diff(Delta(:,2))>Threshold])+1);
NewDelta = NaN(index(end),2);
NewDelta(index,:) = Delta;


Deinen zweiten Programmabschnitt verstehe ich leider nicht.

Grüße,
Sirius
Private Nachricht senden Benutzer-Profile anzeigen
 
LiGa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2013, 08:52     Titel:
  Antworten mit Zitat      
Hallo Sirius!
Vielen Dank für deine Hilfe! Funktioniert perfekt Very Happy

Tja, das zweite war ein Versuch das ganze in einen neuen Vektor zu speichern. Hat aber nicht so geklappt, wie ich mir das vorgestellt hatte.

Danke nochmal! Problem gelöst!

lg Lisa
Private Nachricht senden Benutzer-Profile anzeigen
 
LiGa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2013, 09:38     Titel:
  Antworten mit Zitat      
Hallo Sirius!

Ein Problem hab ich leider doch noch. Meine Zeile NaN wird eine Stelle zu früh eingefügt. Ich verstehe aber leider nicht wieso und wie ich das ändern kann?! Hab jetzt ein paar Varianten durchprobiert, aber keine Lösung gefunden.
Du siehst, der Sprung ist eigentlich zw. Zeile 841/842. daher sollte NaN dazwischen eingeschoben werden (842).

Code:

839  8,92242500000000   0,000155999999998713
840  8,92258100000000   0,000125000000000597
841  NaN                                   NaN
842  8,92270600000000   1,45888400000000
843  10,3815900000000   0,0227400000000007
844  10,4043300000000   0,000149999999999650
845  10,4044800000000   0,000130000000000408


Die Funktion sieht jetzt so aus:
Code:

function [NewDelta] = DetectInt(Delta,Threshold)
% if delta>threshold movement is interrupted --> pen not on display
% --> set value NaN to seperate movements
  for i=0:length(Delta)
      index = cumsum(([0; diff(Delta(:,2))>Threshold])+1);
      NewDelta = NaN(index(end),2);
      NewDelta(index,:) = Delta;
  end
end


Ich bitte nochmal um Hilfe!
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 03.05.2013, 10:01     Titel:
  Antworten mit Zitat      
Wenn ich deinen geposteten Code bei mir lauffähig umschreibe, macht er genau das, was er soll, findet also die Lücke an der richtigen Stelle.

Frage: wozu hast du die Schleife über alle Zeilen drinn?`die ist mMn überflüssig.
Und dein geposteter Code funktioniert nicht für Matrizen mit mehr als 2 Spalten, da du NewDelta nur mit 2 Spalten vorerstellst.

Code:

index = cumsum(([0; diff(Delta(:,2))>Threshold])+1);
NewDelta = NaN(index(end),size(Delta,2));
NewDelta(index,:) = Delta;
 

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
LiGa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2013, 10:14     Titel:
  Antworten mit Zitat      
Hallo Martina,

ja stimmt, die Schleife ist umsonst ...

aber bei mir wird nach wie vor die NaN Zeile eine Stelle zur früh eingefügt - verstehe ich ehrlichgesagt nicht.
Wie sieht der cumsum-Vektor bei dir aus?

Es stimmt auch, denn die Differenz ist ja an Stelle 841 > Threshold.
Aber die Zeile NaN sollte danach eingefügt werden.
Eine Idee, wie ich das hinbekomme?
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 03.05.2013, 10:21     Titel:
  Antworten mit Zitat      
Die cumsum-zeile ergibt:
Code:

Index =  1
     2
     3
     5
     6
     7


Frage: hast du die Kommata in Punkte umgewandelt? Denn sonst würdest du eine 5x6 Matrix übergeben. Also so:
Code:

Delta = [839  8.92242500000000   0.000155999999998713
840  8.92258100000000   0.000125000000000597
842  8.92270600000000   1.45888400000000
843  10.3815900000000   0.0227400000000007
844  10.4043300000000   0.000149999999999650
845  10.4044800000000   0.000130000000000408]
 

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
LiGa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2013, 10:27     Titel:
  Antworten mit Zitat      
Ja, die Kommas sind in Punkte umgewandelt (beim rauskopieren, schlecht dargestellt - sorry)

Ich hab ja nur einen kleinen Ausschnitt aus meiner Matrix gepostet. Die ist ja, abhängig von der Messdauer und Übung, ca. 5000x2
Private Nachricht senden Benutzer-Profile anzeigen
 
LiGa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2013, 11:12     Titel:
  Antworten mit Zitat      
Bei mir liegt das Problem offensichtlich am Vektor, der mit cumsum genieriert wird. Der Sprung ist hier 1 Stelle früher als bei dir ?!?

Code:

839   839
840   840
841   842
842   843
843   844
844   845
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 03.05.2013, 11:21     Titel:
  Antworten mit Zitat      
Ähm - Moooohment!
Wie sieht deine Matrix aus, die du dem Delta übergibst? Hat diese 2 oder 3 Spalten?

Ich ging davon aus, dass es drei Spalten sind. Aber evt. übergibst du ja nur Spalte 2 und 3 aus dem Beispiel -> dann würde das Ergebnis passen, da in Spalte 3 der Sprung an genau der Stelle ist.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
LiGa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2013, 11:25     Titel:
  Antworten mit Zitat      
Uuui , so ein blödes Misverständnis. Die erste Spalte repräsentiert nur die Zeilennummer ...

Nein mein Delta Vektor hat 2 Spalten:

Code:
8,92242500000000   0,000155999999998713
8,92258100000000   0,000125000000000597
8,92270600000000   1,45888400000000
10,3815900000000   0,0227400000000007
10,4043300000000   0,000149999999999650
10,4044800000000   0,000130000000000408
10,4046100000000   0,0261600000000009


wobei Spalte1 die Zeitwerte sind und Spalte2 das Delta
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 03.05.2013, 11:31     Titel:
  Antworten mit Zitat      
Dann ist klar, woher der Fehler kommt: du suchst derzeit in der ZWEITEN Spalte nach einem Sprung, musst aber die 1.Spalte nutzen.

Du musst also in der cumsum-zeile "Delta(:,2)" in "Delta(:,1)" ändern.
Ich ging davon aus, dass du 3 Spalten hast...somit paßte es, dass er in der zweiten Spalte sucht.

Code:

index = cumsum(([0; diff(Delta(:,1))>Threshold])+1);
NewDelta = NaN(index(end),size(Delta,2));
NewDelta(index,:) = Delta;
 

_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
LiGa
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 02.05.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.05.2013, 11:35     Titel:
  Antworten mit Zitat      
Hallo Martina,

ich habe meinen Fehler soeben gefunden. Ich habe in der Delta-Matrix bereits die Differenz der Zeitwerte drinnen.
Wenn ich nur die Zeitwerte nehme und die Berechnung durchführe klappts Very Happy

Vielen Dank für deine Hilfe!!

lg Lisa
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.