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

Zeilen in Matrix in Abhängigkeit von Berechnung einfügen?

 

alpha1408
Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 10.11.11
Wohnort: Braunschweig
Version: ---
     Beitrag Verfasst am: 20.01.2014, 14:22     Titel: Zeilen in Matrix in Abhängigkeit von Berechnung einfügen?
  Antworten mit Zitat      
Hallo zusammen!
Ich habe ein Problem, welches mich an meine programmiertechnischen Grenzen bringt.

Ich habe einen v-t-Schrieb eines Fahrzeugs in einer 26540x2 Matrix. Dabei ist in der ersten Spalte die aktuelle Geschwindigkeit gegeben, in der zweiten Spalte steht die aktuelle Dauer in Schritten von 0,075s.

Mein Ziel ist es, bei Beschleunigungen > als 1m/s² zwischen die beiden entsprechenden Zeilen eine zusätzliche Zeile einzufügen mit t=0,075 und v=(v_vorher+v_nachher)/2. Dadurch soll die Beschleunigung in diesem Abschnitt halbiert werden.

Wirklich weit bin ich noch nicht gekommen, bisher habe ich nur folgendes:
Code:
clear all

load ('Cycle.mat');

v=Cycle(:,1)/3.6;
t=Cycle(:,2);


a=diff(v)./diff(t);

for i=length(a)
    if a(i)>1.0

% neue Zeile zwischen den gelesenen Werten einfügen
% t_neu = 0.075
% v_neu = 0.5*diff(v)
       


Im Endeffekt möchte ich den Zyklus partiell an den Stellen um einen weiteren zwischenschritt strecken, an denen die Beschleunigung zu hoch ist.

Hat jemand eine Idee?

Danke und VG,
Micha
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 20.01.2014, 15:08     Titel:
  Antworten mit Zitat      
was meinst du mit dauer? ein beispiel datensatz währe hilfreich gewesen. mit sachen wie
Code:
clear all

load ('Cycle.mat');

v=Cycle(:,1)/3.6;
t=Cycle(:,2);

kann ich nichts anfangen ^^.
wenn du mit dauer meinst wie lange die geschwindigkeit v gefahren wird was passiert dann beim beschleudingen.?
ist die dauer dann immer 0.075? falls ja bekommst du mit diff dort 0 was zu einer unendlichen beschleunigung in der zeile
Code:
führt. oder meinst du mit dauer nur die systemzeit die in schritten von 0.075 läuft.
26k einträge sind nicht viel. die kannst du einfach mit einer while oder forschleife abarbeiten.
ps. clear all sollte man nicht verwenden wenn man nicht muss. warum wurde hier im forum schon öfter erklärt
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
alpha1408
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 10.11.11
Wohnort: Braunschweig
Version: ---
     Beitrag Verfasst am: 20.01.2014, 16:27     Titel:
  Antworten mit Zitat      
Hallo Winkow,

danke für deine schnelle Antwort. Du hast recht, natürlich läuft die Systemzeit in Schritten von 0,075 s und es steht nicht überall 0,075 drin.

Schleife ist gut und schön. Mein Problem liegt eher dadrin, mit welchen Befehlen ich die entsprechende Zeile an der entsprechenden Stelle einfügen kann. Dabei müssen ja auch die gesamten nachfolgenden Werte im Zeitschrieb geändert werden Sad

Danke schonmal für deine Überlegungen!
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 20.01.2014, 16:50     Titel:
  Antworten mit Zitat      
Code:
v=[1,1,1,3,3];
dt=0.075;
while any(diff(v)/dt>1)
k=1;
while k<numel(v)-1
    if(v(k+1)-v(k))/dt>1
        v=[v(1:k),(v(k+1)+v(k))/2,v(k+1:end)];
    end
    k=k+1;
end
end

was du mit der zeit machen willst ist mir immernoch nicht klar. beispiel datensätze sind wirklich hiflreich bei sowas.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
alpha1408
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 10.11.11
Wohnort: Braunschweig
Version: ---
     Beitrag Verfasst am: 20.01.2014, 17:03     Titel:
  Antworten mit Zitat      
Hallo Winkow,

anbei ist ein gekürzter Beispieldatensatz. Den kompletten Satz darf ich nicht rausgeben, aber letztendlich ist es ja das gleiche.

Du wirst erkennen, dass wenn in der Geschwindgigkeitsspalte (ist noch in km/h angegeben) eine zusätzliche Zeile eingefügt wird, auch die Spalte mit der Zeit verlängert werden muss. Aber das geht eventuell auch am Ende, oder?

Vielen lieben Dank bereits für deine Hilfe! Smile

VG,
Micha

Cycle.xls
 Beschreibung:

Download
 Dateiname:  Cycle.xls
 Dateigröße:  72.5 KB
 Heruntergeladen:  237 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 20.01.2014, 17:15     Titel:
  Antworten mit Zitat      
was soll mit der zeit passieren? soll der rest einfach nur nach hinten verschoben werden? das verfälscht ja die daten da dann die zeiten nicht mehr zu den geschwindigkeiten passen^^ du kannst die neuen zeiten genau so einfügen wie ich die geschwindigkeiten eingefügt habe in meinem beispiel.
bei mir bin ich davon ausgegangen das sich einfach alles um 0.075 nach hinten verschiebt.
dann kannst du nachträglich den neuen zeitvektor einfach mit
Code:
t=(0:numel(v)-1)*0.075
erzeugen.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
alpha1408
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 10.11.11
Wohnort: Braunschweig
Version: ---
     Beitrag Verfasst am: 20.01.2014, 17:25     Titel:
  Antworten mit Zitat      
Vielen Dank, ich probiere es mal aus Smile

Wäre ich allein nicht drauf gekommen Embarassed

EDIT:
Error using horzcat
Dimensions of matrices being concatenated are not consistent.

Error in Zyklenanpassung (line 13)
v=[v(1:k),(v(k+1)+v(k))/2,v(k+1:end)];
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 20.01.2014, 17:51     Titel:
  Antworten mit Zitat      
du must mein beispiel schon an deine daten anpassen ^^ ich hab einen zeilenvektor als beispiel verwendet. du einen spalten vektor. das geht auch aus der fehlermeldung herraus ^^
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
alpha1408
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 35
Anmeldedatum: 10.11.11
Wohnort: Braunschweig
Version: ---
     Beitrag Verfasst am: 21.01.2014, 16:27     Titel:
  Antworten mit Zitat      
Hallo Winkow,

hast natürlich Recht Smile
Ich habe eben mal das Programm getestet und es macht noch nicht ganz das, was ich eigentlich möchte.

Ich gebe dir mal ein konkretes Beispiel aus der Excel, die ich hochgeladen habe:

Zeile 57 und 58 sehen ja so aus:

0.093463410 4,200
0.373853620 4,275

Daraus folgt eine Beschleunigung von 3,73 m/s^2.

Ich hätte gerne folgendes stehen:

0.093463410 4,200
0.140195105 4,275 <--- Zwischenschritt
0.373853620 4,350

Ich glaube, dass durch die While-Schleife jeder Wert soweit angepasst wird, bis a<1 ist. Sehe ich das richtig?
Ziel war aber, zwischen jeden Schritt, bei dem a>1 ist, nur einmal einen Zwischenschritt zu setzen, unabhängig vom Ergebnis.

Mit deiner Programmierung sind meine Beschleunigungen jetzt zu gering. Auch wenn ich a=2 als Grenze setze, bekomme ich noch keine passenden Werte.

Alle Beschleunigungen >1 sollen halbiert werden, nicht unter 1 gebracht werden.
Ich habe schon etwas mit deinem Code gespielt, aber nichts gescheites rausbekommen Sad

EDIT:
Habe festgestellt, dass wenn ein Zwischenschritt eingefügt wurde, k=k+2 gelten muss, um nicht nochmal zu halbieren.
Code:

dt=0.075;
if any(diff(v)/dt>1)    % nur wenn größere Beschleunigungen auftreten
k=1;
while k<numel(v)-1;         % Abarbeitung bis zum Ende des Zyklus
    if(v(k+1)-v(k))/dt>1    % Wenn dv/dt > 1 ~ Beschleunigung 1 m/s^2
        v=[v(1:k);(v(k+1)+v(k))/2;v(k+1:end)];
        k=k+2;
    else
    k=k+1;
    end
end
end
t=((0:numel(v)-1)*0.075)';
 

Jetzt klappt es! Vielen lieben Dank!
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.