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

Anfangs- und Endwerte aus Matrix auslesen

 

Karle
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 02.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2019, 23:24     Titel: Anfangs- und Endwerte aus Matrix auslesen
  Antworten mit Zitat      
Guten Abend wertes Forum,

zuallererst möchte ich sagen dass ich was Matlab angeht noch sehr grün hinter den Ohren bin und mir gerade versuche den Umgang damit selbst beizubringen.
Trotz langer Recherche habe ich bis lang so gar keinen Ansatz gefunden welcher zur Lösung meines Anliegens führen könnte.

von daher wende ich mich an euch.

ich stehe vor folgendem Problem:

ich habe 2 Matrizen, eine (Name: a, ~70000x5) mit "Rohdaten" wie zum Beispiel Bremsdrücken Motordrehzahlen und eingelegtem Gang aus der ich eine weitere Matrix (Name:speed, ~70000x1) mit den zugehörigen Geschwindigkeiten mit Matlab erstelle.

Ich suche nun nach einem Weg wie ich Matrix a nach definierten Werten durchsuchen kann, z.B. bremsdruck vorne > 5 && bremsdruck hinten > 5.
Sollten beide Bedingungen wahr sein, sollte mir der zugehörige Anfangswert aus Matrix speed (also der erste Wert für den die Bedingungen wahr sind) und der zugehörige Endwert (also der letzte Wert aus Matrix speed bevor eine oder beide Bedingungen unwahr werden) in eine neue Matrix schreiben (Am praktischsten wäre es wenn Anfangs- und Endwert jeweils untereinander stehen würden und jede neue Paarung in eine neue Spalte geschrieben würden).
Die Bedingungen werden definitiv mehrmals zwischen wahr und unwahr umschalten.

Mein Ziel ist mit den Anfangs- und Endwerten die Änderung der kintetischen Energie zu berechnen.



Mein Code sieht momentan so aus:
Code:
pbrake_f_a = a (:,4);
pbrake_r_a = a (:,5);
v = speed (:,1);
counter = 0;
temp = 0;
speed1 = zeros(2,length(a));
for i=1:length(speed1)
    if pbrake_f_a(i) > 5 && pbrake_r_a(i) > 5 && v(i) > 0 && temp < 1
       
     counter = counter+1;
     position(1, counter) = i;
     speed1(1, counter) = speed(i);
     temp = 1;
     
    elseif temp > 0
       
     position(2, counter) =i;
     speed1(2, counter) = speed(i-1);
     temp = 0;
    end
  speed1 = speed(position);
end


Ich habe es zumindest geschafft das er mir die Geschwindigkeiten in einer 2x 2417 Matrix ausgibt, allerdings sind das immer aufeinanderfolgende Werte.

Ich hoffe ich konnte euch mein Problem halbwegs verständlich schildern und bin für jeden Hinweis/Tipp dankbar.
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: 19.06.2019, 11:25     Titel: Re: Anfangs- und Endwerte aus Matrix auslesen
  Antworten mit Zitat      
Hallo Karle,

Zitat:
z.B. bremsdruck vorne > 5 && bremsdruck hinten > 5.
Sollten beide Bedingungen wahr sein, sollte mir der zugehörige Anfangswert aus Matrix speed (also der erste Wert für den die Bedingungen wahr sind) und der zugehörige Endwert (also der letzte Wert aus Matrix speed bevor eine oder beide Bedingungen unwahr werden)

Code:
a = rand(70000, 5);   % Test data
speed = rand(70000, 1);
match = (a(:, 4) > 5 && a(:,5) > 5);
index1 = find(match, 1, 'first');
index2 = find(match, 1, 'last');
speed(index1)
speed(index2)

Das verstehe ich nicht:
Zitat:
Am praktischsten wäre es wenn Anfangs- und Endwert jeweils untereinander stehen würden und jede neue Paarung in eine neue Spalte geschrieben würden


Zitat:
Die Bedingungen werden definitiv mehrmals zwischen wahr und unwahr umschalten.

Hm. Vielleicht könnte man die Frage vereinfachen: Wenn du gleich hiermit beginnst:
Code:
match = (a(:, 4) > 5 && a(:,5) > 5);

Nun möchtest du die Indices finden, in denen der Wert von 0 auf 1 wechselt, und dann wieder von 1 auf 0 - richtig?
Code:
ini = strfind(match, [false, true]);
fin = strfind(match, [true, false]) + 1;

Nun muss man noch bedenken was geschieht, wenn das erste bzw. letzte Element von "match" true oder false ist. Eventuell einfach
match = [false, match, false] einsetzen zur Sicherheit. Dann muss man noch die Indices um 1 verkleinern, da man die Werte ja verschoben hat.

Probiere es mal damit.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Karle
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 02.06.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.09.2019, 20:16     Titel:
  Antworten mit Zitat      
Guten Abend Jan, guten Abend liebes Forum,

als erstes möchte ich mir bei dir Jan entschuldigen, trotz deiner raschen Antwort hab ich mich monatelang nicht gemeldet, dies hat persönliche Gründe auf die ich nicht näher eingehen möchte, trotzdem war es nicht gerade die feine englsiche Art einfach sang- und klanglos zu verschwinden.

Nun zu deinem Code, leider hat er mir bei meinem Problem nicht wirklich weiter geholfen, was aber vermutlich an meiner doch recht speziellen Aufgabenstellung lag.

Dank eines Kommilitonen bin ich nun aber doch an eine brauchbare Lösung gekommen die ich euch nicht vorenthalten will.


Code:
% der Druck ab dem ein Bremsvorgang erkannt wird
p_v = 5.5; %vorne
p_h = 5.5; %hinten

min_l = 4; %minimale Länge des Bremsvorgangs (Filter)

temp = 0;
Bremsvorgang_counter = 0;

for i = 1 : length(pbrake_f_abar)
   if pbrake_f_abar(i) > p_v && pbrake_r_abar(i) > p_h && vwheel_flkmh (i) > 0 && temp == 0
       Bremsvorgang_counter = Bremsvorgang_counter + 1;
       grenzen_temp(Bremsvorgang_counter, 1) = i;
       temp = 1;
   end
   if pbrake_f_abar(i) < p_v && temp == 1
       grenzen_temp(Bremsvorgang_counter, 2) = i - 1;
       temp = 0;
   end
end


%Bereiche nach Länge filtern
index = 0;
for j = 1 : length(grenzen_temp)
    diff = grenzen_temp(j, 2) - grenzen_temp(j, 1);
    if diff >= min_l
        index = index + 1;
        grenzen(index, :) = grenzen_temp(j, :);
    end
end

s=size(grenzen);
   vwheel_fl_brake_overall= (zeros(s(1),2));
   vwheel_fl_brake1=vwheel_flkmh(grenzen(:,1),1);
   vwheel_fl_brake2=vwheel_flkmh(grenzen(:,2),1);
   vwheel_fl_brake_overall=[vwheel_fl_brake1,vwheel_fl_brake2];
   
   vwheel_fr_brake_overall= (zeros(s(1),2));
   vwheel_fr_brake1=vwheel_frkmh(grenzen(:,1),1);
   vwheel_fr_brake2=vwheel_frkmh(grenzen(:,2),1);
   vwheel_fr_brake_overall=[vwheel_fr_brake1,vwheel_fr_brake2];
   
   vwheel_rl_brake_overall= (zeros(s(1),2));
   vwheel_rl_brake1=vwheel_rlkmh(grenzen(:,1),1);
   vwheel_rl_brake2=vwheel_rlkmh(grenzen(:,2),1);
   vwheel_rl_brake_overall=[vwheel_rl_brake1,vwheel_rl_brake2];
   
   vwheel_rr_brake_overall= (zeros(s(1),2));
   vwheel_rr_brake1=vwheel_rrkmh(grenzen(:,1),1);
   vwheel_rr_brake2=vwheel_rrkmh(grenzen(:,2),1);
   vwheel_rr_brake_overall=[vwheel_rr_brake1,vwheel_rr_brake2];

 



Sollten hierzu Fragen auftauchen einfach melden.

Grüßle

Karle
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.