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

Bearbeiten eines einzeiligen Vektors

 

user94
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.09.16
Wohnort: ---
Version: R2015B
     Beitrag Verfasst am: 22.09.2016, 11:29     Titel: Bearbeiten eines einzeiligen Vektors
  Antworten mit Zitat      
Hallo,
Ich habe ein Problem mit der Verarbeitung von sehr großen einzeiligen Vektoren.
In dem Einzeiligen Vektor (Bsp. 1x376488) stehen Zahlen aus einem Versuch:
Diese Zahlen sind grundsätzlich so aufgebaut 000….1111…00000….2222….00000….3333……usw.
Mein Problem ist, dass der Sprung der Werte (1,2,3… auf 0) nicht sofort erfolgt, sondern ein paar Werte dazwischen liegen. Beispiel: 16,16,16,16,16, 12, 8, 4,1,0,0,0,
Gewünscht wäre 16,16,16,16,0,0,0,0 ; die Werte dazwischen sollten 0 gesetzt werden.
Gibt es eine Möglichkeit das irgendwie zu realisieren, ohne das per Hand machen zu müssen ?
Mit Zähler und der Mean-Funktion habe ich es schon versucht, aber das klappt nicht wirklich.
Da immer neue Vektoren eingelesen werden mit unterschiedlichen Längen kann man auch keine bestimmten Spalten ansprechen und diese Null setzen.

Vielen Dank schon mal.
Private Nachricht senden Benutzer-Profile anzeigen


gs
Forum-Century

Forum-Century


Beiträge: 172
Anmeldedatum: 17.03.16
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.09.2016, 13:21     Titel:
  Antworten mit Zitat      
hi,

das sieht nach einen Einzeiler aus:

bsp.:
Code:

a = [16, 16, 16, 16, 16, 12, 8, 4, 1, 0, 0, 0]

a(a<=12)=0
 


Gruß gs
_________________

Mein Seite.
Private Nachricht senden Benutzer-Profile anzeigen
 
user94
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.09.16
Wohnort: ---
Version: R2015B
     Beitrag Verfasst am: 22.09.2016, 13:33     Titel:
  Antworten mit Zitat      
Das würde funktionieren wenn das der Ganze Vektor wäre Very Happy.

Leider sieht dieser eine Vektor so aus: (Beispielhaft)

0,0,0,0,0,1,1,1,1,0,0,0,0,0,2,2,2,2,2,1,1,1,1,0,0,0,0,0,0,3,3,3,3,2,1,0,0,0.........16,16,16,8,4,2,1,0,0,0,17,17,17,13,11,5,3,1,0,0,0,0,0

Diese Zwischenschritte von dem jeweiligen Wert auf 0(rot markiert), gilt es zu eliminieren (Null zu setzen)
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 22.09.2016, 13:54     Titel:
  Antworten mit Zitat      
Hallo,

eine funktionierende Möglichkeit:

eine for-Schleife über die Elemente laufen lassen, in der Elemente 0 gesetzt werden, wenn das nächste ungleiche nach links größer und das nächste ungleiche nach rechts kleiner ist (jeweils mit find ).

Es geht vermutlich effizienter, aber schneller als den Vektor händisch zu durchlaufen dürfte es allemal sein :)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
user94
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.09.16
Wohnort: ---
Version: R2015B
     Beitrag Verfasst am: 22.09.2016, 18:29     Titel:
  Antworten mit Zitat      
Danke für die Antworten,

Ich sollte meinen Vektor etwas genauer beschreiben.
Es handelt sich um ein Signal, das auf einen bestimmten Wert "x" geht (angefangen bei 1), dann auf Null zurückspringt und dann auf den vorherigen Wert +1 , anschließend wieder auf 0 usw.
Die Werte sind leider nicht konstant bei einem Wert, sondern schwanken +- 0.1.
Ein Ansatz wäre, diejenigen Werte, die dem vorherigen Wert um mehr als bspw. 0.5 abweichen gleich 0 zu setzen.
Im Anhang ist der Vektor.
Null zu setzen sind die Werte vor und nach erreichen des jeweiligen "Zielwerts"

Vektor.mat
 Beschreibung:
Der beschriebene Vektor

Download
 Dateiname:  Vektor.mat
 Dateigröße:  161.6 KB
 Heruntergeladen:  597 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 24.09.2016, 17:25     Titel:
  Antworten mit Zitat      
Hallo,

bitte von Anfang an ein realistisches Beispiel.
Wenn die Situation etwas anders ist, musst du halt die Vorgehensweise etwas anpassen.

Code:
load Vektor
x = p_B;
x = round(single(x));

idx = 1;

while idx < numel(x)
    anfangHoch = find(x(idx:end) > 0, 1) + (idx-1);
    if ~isempty(anfangHoch)
        endeHoch = find(x(anfangHoch:end) == 0, 1) + (anfangHoch-1);
        xSelect = x(anfangHoch:endeHoch);
        top = find(xSelect == max(xSelect)) + (anfangHoch-1);
        x(anfangHoch:endeHoch) = 0;
        x(top) = max(xSelect);
        idx = endeHoch + 1;
    else
        idx = numel(x);
    end
end

plot(p_B)
hold on
plot(x, 'g')
   


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
user94
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.09.16
Wohnort: ---
Version: R2015B
     Beitrag Verfasst am: 26.09.2016, 07:28     Titel:
  Antworten mit Zitat      
Hallo Harald,

beim Nächsten mal verwende ich gleich ein reales Beispiel, ich dachte durch die Vereinfachung ist es leichter verständlich, aber das haut dann eben nicht hin.

Vielen Dank für deine Hilfe, mit deiner Lösung kann ich weiterarbeiten!

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
user94
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.09.16
Wohnort: ---
Version: R2015B
     Beitrag Verfasst am: 26.09.2016, 09:38     Titel:
  Antworten mit Zitat      
Allerdings klappt das ganze bei meinem nächsten Vektor leider nicht mehr.
Zu ändern wären jetzt die Wertebereiche oder ?

Vektor2.mat
 Beschreibung:

Download
 Dateiname:  Vektor2.mat
 Dateigröße:  185.18 KB
 Heruntergeladen:  565 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.09.2016, 10:12     Titel:
  Antworten mit Zitat      
Hallo,

du kannst den Code quasi beliebig anpassen und insbesondere, was den Anfang und das Ende eines Peaks beschreibt.

Das Problem ist aus meiner Sicht, dass das jetzige Signal stärker verrauscht ist. Eine Abhilfe auf die Schnelle wäre eine Glättung, z.B. mit
Code:
x = movmean(x, 100);


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
user94
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.09.16
Wohnort: ---
Version: R2015B
     Beitrag Verfasst am: 26.09.2016, 11:20     Titel:
  Antworten mit Zitat      
Hat funktioniert!
Übrig bleiben nun nur noch kleine Ausreisser, wie in der Grafik zu sehen ist.
Wie könnte man den markierten Bereich noch eliminieren ?

Spitzen.PNG
 Beschreibung:

Download
 Dateiname:  Spitzen.PNG
 Dateigröße:  90.4 KB
 Heruntergeladen:  575 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.492
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.09.2016, 11:51     Titel:
  Antworten mit Zitat      
Hallo,

z.B. das Glättungsfenster auf 200 vergrößern.

Es gibt da sicher viele Möglichkeiten. Letztlich ist da deine Kreativität gefragt.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
user94
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 22.09.16
Wohnort: ---
Version: R2015B
     Beitrag Verfasst am: 06.10.2016, 08:18     Titel:
  Antworten mit Zitat      
Hallo,
ich hätte nochmal eine ähnliche Frage.

Das Signal ist auf dem Bild zu sehen. Kann ich auch einen bestimmten Bereich mitteln, wie es rot markiert ist ?
Beispielsweise den Mittelwert der Zellen 30000-60000 usw. sodass sich ein Verlauf ergibt wie in rot angedeutet.
Den Vektor ist ebebfalls angehängt.

M_B.mat
 Beschreibung:

Download
 Dateiname:  M_B.mat
 Dateigröße:  391.69 KB
 Heruntergeladen:  549 mal
M_B.PNG
 Beschreibung:

Download
 Dateiname:  M_B.PNG
 Dateigröße:  78.16 KB
 Heruntergeladen:  612 mal
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.