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

Bestimmte Werte und deren Anteile im Vektor bestimmen

 

birdman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2012, 12:16     Titel: Bestimmte Werte und deren Anteile im Vektor bestimmen
  Antworten mit Zitat      
Folgendes Problem: Ich habe ein Geschwindigkeitsprofil in Form eines Vektors aus welchem Ich die Werte der Geschwindigkeitssprünge und die Dauer der gefahrenen Geschwindigkeit bestimmen möchte.

Beispiel: v=[10 10 10 10 30 30 30 5 5 5 5 5]

Ich habe es schon geschafft die Werte der Geschwindigkeitsänderung zu bestimmen.Also habe ich einen Vektor der ungefähr so aussieht--> x=[10 30 5]. nun möchte ich herausfinden wie lange das Fahrzeug mit den jeweiliegen Geschwindigkeiten fährt. Im Sinne von mit 10m/s fährt es 4s,danach mit 30m/s 3s lang,danach mit 5m/s 5s usw.

Wie mache ich das??Ich habe es mittlerweile geschafft die Gesamtanteile herauszukriegen,also z.B mit 10m/s insgesamt 30 min,mit 30m/s insgesamt 1Stunde. Das ist nicht ganz was ich brauche.Ich benötige die einzelnen Abschnitte der Geschwindigkeiten.

Ich hoffe jemand kann mir helfen.


Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 07.05.2012, 12:42     Titel:
  Antworten mit Zitat      
Hi,

suchstd du sowas:
Code:

v =

    10    10    10    10    30    30    30     5     5     5     5     5

>> b=unique(v,'first')

b =

     5    10    30

>> sum(v(:)==b(1))

ans =

     5

>> sum(v(:)==b(2))

ans =

     4

>> sum(v(:)==b(3))

ans =

     3
 


Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 07.05.2012, 13:09     Titel:
  Antworten mit Zitat      
Hi,

Code:
duration_times=hist(v,unique(v));


Grüße, MaFam
Private Nachricht senden Benutzer-Profile anzeigen
 
birdman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2012, 13:21     Titel:
  Antworten mit Zitat      
Danke erstmal für die Mühe. Leiderpasst das mit unique nicht ganz da die werte dadurch anders geordnet werden.

Wie gesagt die Wertsprünge habe ich schon in einem Vektor abspeichern können,nur die Dauer kriege ich nicht hin.

Das mit duration_time muss ich später ausprobiereren,bin noch auf der Arbeit.Könnte hinhauen.
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 07.05.2012, 13:32     Titel:
  Antworten mit Zitat      
Hi,

probier folgendes:
Code:

anz5   = histc(v,5);
anz10 = histc(v,10);
anz30 = histc(v,30);
 


Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 07.05.2012, 13:54     Titel:
  Antworten mit Zitat      
histc(values, edge) (hist erstellt ja einen Plot) verlangt offenbar einen sortierten edge-Vektor. Die Verwendung von histc(v, Wertsprünge) wird dir nicht die gewünschte Reihenfolge liefern. Wenn du tatsächlich histc() verwenden willst, wirst du wohl mit einer Schleife jeden Wertesprung separat aufrufen müssen, damit die Reihenfolge erhalten bleibt, die du haben willst. Im Übrigen ist dieser Ansatz ungeeignet, wenn v so aussieht:

v=[10 10 10 10 30 30 30 5 5 5 5 5 10 10]

...also zum Schluss die Geschwindigkeit nochmals für 2 Sekunden 10 m/sec beträgt.
Private Nachricht senden Benutzer-Profile anzeigen
 
birdman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.05.2012, 17:46     Titel:
  Antworten mit Zitat      
Ja also wie gesagt die Gleiderund bzw die Bestimmung der Wert habe ich mit
Code:

s = v([true, diff(v) ~= 0])
 


gelöst.Das ist nicht mein wesentliches Problem.Und ja ich habe mir schon gedacht dass ich das mit einer Schleife machen sollte,da ich aber nicht über die nötige Kenntnis verfüge,kreige ich es nicht gebacken. Ich habe hier im Forum am sowas in der Art gefunden. Die Schleife macht aber wieder nur den Gesamtanteil der Werte.

Code:
y={[],[]};

for i=1:length(v)

    if isempty(find(cell2mat(y(:,1))==v(i)))
    FindXi = find(v==v(i));
    y(end+1,:)={v(i) , FindXi};
    end
       
end

y(1,:)=[];

Habt ihr ne Idee?
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 08.05.2012, 09:10     Titel:
  Antworten mit Zitat      
Hallo,

einen Punkt sollten wir zuvor noch klären. Kann dein v so aussehen:

v=[10 10 10 10 30 30 30 5 5 5 5 5 10 10] ?

Hier taucht eine 10er Gruppe mehrfach auf. Wenn dieser Fall nicht eintreten kann, so gibt es zielführende Vorschläge in diesem Thread.

Andernfalls muss man sich wohl etwas neues überlegen.

Grüße, MaFam
Private Nachricht senden Benutzer-Profile anzeigen
 
birdman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2012, 09:25     Titel:
  Antworten mit Zitat      
Hi,

sorry ich vergessen das zu erwähnen. Ja der Vektor kann nicht nur so aussehen,sondern er sieht genau so aus oder hat diese Form.Die Werte tausche an mehreren Stellen auf und weisen auch unterschiedliche Dauer bzw Perioaden auf.Das ist ja genau das was mir Probleme bereitet.

Grüße
 
Vito
Forum-Guru

Forum-Guru


Beiträge: 315
Anmeldedatum: 02.11.09
Wohnort: Stuttgart
Version: ---
     Beitrag Verfasst am: 08.05.2012, 09:34     Titel:
  Antworten mit Zitat      
Hi,

meinst sowas:
Code:

 v=[10 10 10 10 30 30 30 5 5 5 5 10 10 10 5 20 20 20];
 anz = unique(v);
 duration = {};
 for k = 1:length(anz)
     dur_ = histc(v,anz(k));
     duration{k} = {anz(k),dur_};
 end
 


Gruß,
Vito
Private Nachricht senden Benutzer-Profile anzeigen
 
MaFam
Forum-Meister

Forum-Meister


Beiträge: 799
Anmeldedatum: 02.05.12
Wohnort: ---
Version: R2009b
     Beitrag Verfasst am: 08.05.2012, 09:41     Titel:
  Antworten mit Zitat      
Gut, dann hier ein Vorschlag:

Gehe über alle Elemente des Vektors und
1. Speichere initial v(1) in einer Matrix -> M(1,1)=v(1) und initial die Anzahl mit M(1,2)=1. k sei initial 1.
2. Wenn v(i+1) gleich v(i), dann M(k,2)=M(k,2)+1, sonst setze M(k+1,1)=v(i+1).
3. Erhöhe k um 1, wenn v(i+1) ungleich v(i).

Das ergibt eine Matrix mit dem Wert (Repräsentanten) einer Gruppe in der ersten Spalte und dessen Anzahl, also der kumulierten Zeit, in der zweiten Spalte.
Private Nachricht senden Benutzer-Profile anzeigen
 
birdman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2012, 09:59     Titel:
  Antworten mit Zitat      
Vielen Dank erstmal an euch Beide,werde beide Möglichkeiten sofort ausprobieren sobald ich zu hause bin.

Ich hätte da noch eine kleine Bitte.Ich habe einen zweiten Thread namens "Lastkollektive" zu einem anderen Problem aufgemacht,welches ich mittlerweile schon fast aufgegeben habe.Vielleicht könntet ihr mir da ja ebenfalls helfen,wäre nett. Confused
 
birdman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2012, 21:27     Titel:
  Antworten mit Zitat      
Danke noch einmal,leider hat nur die Lösung von MaFam geklappt.Wie ich ja schon vorher geschrieben hatte geht es nicht mit dem unique Befehl,da dieser die Werte zwar findet,diese aber umordnet. Und hist passt auch nicht da nur die letzten Perioden der Werte angezeigt werden.
Am Ende sieht der Code so aus:
Code:

v=v_fzg_soll(1:10953)
M=[]
M(1,1)=v(1)
M(1,2)=0
k=1

for i=1:length(v)-1;
 if v(i+1) == v(i)
     M(k,2)=M(k,2)+1
 else
     M(k+1,1)=v(i+1)
     k=k+1
 end
end
M(:,2)=(M(:,2)+1)

 


danke,wart ne große Hilfe
 
birdman

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.05.2012, 17:58     Titel:
  Antworten mit Zitat      
Hi,

Okay Leute es ist doch noch ein Problem aufgetaucht.Die Werte werden so schon ganz gut ausgewertet. Aber ich brauche jetzt nicht nur die Sprungwerte bzw deren kumulierte Zeit, sondern beide Zeitwerte .

Code:

v=[10 10 10 10 30 30 30 5 5 5 5 10 10 10 5 20 20 20];
 


nach dem Beispiel-->
10-->1
10-->4
30-->5
30-->7
5 -->8
5 -->11

ist das möglich??hat jemand eine Idee??
 
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.