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

Anzahl der Vorzeichenwechseln in einem Vektor zählen

 

Gast

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.12.2010, 22:40     Titel: Anzahl der Vorzeichenwechseln in einem Vektor zählen
  Antworten mit Zitat      
Hallo Forenmitglieder,

ich bin Anfänger in Matlab und müsste für ein Programm die Vorzeichenwechsel in einem Vektor zählen.
Kennt sich damit jemand aus?

Grüße,

Gast


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 17.12.2010, 23:31     Titel:
  Antworten mit Zitat      
Hallo,

Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.12.2010, 02:09     Titel: Re: Anzahl der Vorzeichenwechseln in einem Vektor zählen
  Antworten mit Zitat      
Hallo,

Ist [-1, 0, -1] ein Vorzeichen-Wechsel? Und [1, 0, 1]?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Splasher
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 23.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2012, 09:51     Titel:
  Antworten mit Zitat      
Schade dass hierzu nicht mehr geschrieben wurde :-/

Habe genau das gleiche Problem, habe in meinem Matlab-Programm die Abweichung auf die y-Achse, die Strecke auf die x-Achse aufgetragen.

Immer wenn meine Abweichung die 0-Linie durchbricht, würde ich dies gerne Zählen.

Ich kann zwar ohne weite Probleme zählen "wie oft" ich auf der Negativen (bzw. bei der 2.Abweichung positiven Seite) bin, doch brauch ich zusätzlich noch die Anzahl der überschreitungen.

Es kann also sein dass ich 20-x-Werte lang auf der negativen Seite bin - gespeichert wird 20.
Da es sich aber nur um "1" verstoß handelet, hätte ich gerne noch eine möglichkeit dass eine Variable um 1 erhöht wird..

Also sollte die Funktion in etwa folgendes machen:

Wenn der Wert Abweichung kleiner 0 wird => +1
wenn der wert dann wieder positiv wird mach nichts
wenn der wert nachdem er positiv war wieder kleiner 0 wird => +1

Weiß jemand zufällig wie man das realisieren könnte?

kurve.jpg
 Beschreibung:

Download
 Dateiname:  kurve.jpg
 Dateigröße:  35.62 KB
 Heruntergeladen:  836 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


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

Zitat:
Schade dass hierzu nicht mehr geschrieben wurde :-/

Es müssten sich an sich ähnliche Threads finden lassen.

Zitat:
Immer wenn meine Abweichung die 0-Linie durchbricht, würde ich dies gerne Zählen.

Das macht ja mein Vorschlag.

Zitat:
Ich kann zwar ohne weite Probleme zählen "wie oft" ich auf der Negativen (bzw. bei der 2.Abweichung positiven Seite) bin, doch brauch ich zusätzlich noch die Anzahl der überschreitungen.

Ich verstehe den Unterschied zwischen "wie oft" und "Anzahl" nicht.

Auch die weiteren Erläuterungen verstehe zumindest ich leider nicht.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Splasher
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 23.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2012, 13:09     Titel:
  Antworten mit Zitat      
Wenn ich z.B folgende Wertetabelle hätte:

Code:
-1 -1 -1 -1 -1 0 1 2 3 4 -1 -2 -3


hätte ich gerne als ergebniss: 2, da ich mich 2x im negativen Bereich aufhalte.

Ich bekomme es aber nur hin, dass das Ergebniss 8 ist, da ich mich "8 Werte lang" im negativen Bereich aufhalte.

Bisschen blöd zu erklären Sad

edit:
mit nnz(diff(sign(x)) ~= 0) bekomme ich als Ergebnis 308, was wohl ein wenig zu hoch sein dürfte :-/

edit2: Ah, okay, dein Code ist genau 2x so groß wie das Ergebnis (zumindest hoffe ich das Very Happy)

Code:
zaehler=0;
bis_dahin=0;

bis_dahin=size (Abweichung_links,2) -1;

for i=1:1:bis_dahin;

    if ((Abweichung_links(1,i) < 0) && (Abweichung_links(1,i+1) > 0));
       zaehler=zaehler+1;
       
        end
   
   
end
 


so hab ich es jetzt gelöst, sicher keine schöne und elegante Variante, aber es sollte ja funktionieren, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 23.10.2012, 14:06     Titel:
  Antworten mit Zitat      
Hallo
für das obige Beispiel sollte Harald's Algorithmus 3 liefern und nicht 308,

wenn du nur negativen Bereich brauchst dann muss du Harald's Code so anpassen:
Code:

A   = [-1 -1 -1 -1 -1 0 1 2 3 4 -1 -2 -3];
sA = sign(A)
sA(sA>0)=0
nnz(diff(sA)~=0)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Splasher
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 23.10.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.10.2012, 15:21     Titel:
  Antworten mit Zitat      
Ja, benötige einmal negativ und einmal positive überschreitung der 0-Linie.

Die 154 hatte ich bei der Auswertung der angehängten Kurve, nicht bei dem Beispiel.

Wollte mit dem Beispiel nur zeigen was ich meinte Smile

Danke euch beiden!
Private Nachricht senden Benutzer-Profile anzeigen
 
Phippu

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2014, 10:05     Titel:
  Antworten mit Zitat      
Hallo Zusammen

Habe eine Frage zu diesem Thema. Es geht um eine Analyse einer Ganglinie.

Es liegt ein Vektor mit folgender Struktur vor:
x=[0 -1 0 1 -1 -1 0 -1 0 0 0 -1 -1]

Gerne hätte ich nun die Anzahl der Wechsel von -1 zu 1 respektive 1 zu -1.
Also wieviele Vorzeichenwechsel gibt es, wobei -1 0 -1 oder 1 0 1 nicht als Vorzeichenwechsel gilt.

Wäre froh um einen Input, da ich mit den oben erwähnten Tipps bis jetzt nicht weiter gekommen bin.

Danke und Gruss, Phippu
 
Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 22.10.2014, 11:31     Titel:
  Antworten mit Zitat      
Hallo,

dann kannst du einfach die Nullen rauslöschen und den Code von Haralds Antwort benutzen, wobei du auf den Aufruf von sgn() verzichten kannst (du hast sowieso nur +1 oder -1 im Vektor übrig)
Code:
x = [0 -1 0 1 -1 -1 0 -1 0 0 0 -1 -1];
x(x==0) = []; % Nullen löschenm liefert [-1  1  -1  -1  -1  -1  -1]
nnz(diff(x) ~= 0) % liefert für das Beispiel 2


Viele Grüße,
Nras
Private Nachricht senden Benutzer-Profile anzeigen
 
Phippu

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2014, 12:53     Titel:
  Antworten mit Zitat      
Hei Nras

Vielen Dank für deine Antwort, auch wenn meine Frage hinterher betrachtet doch recht unnötig war Smile
 
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.