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

Matrix um definierte Zeitwerte (Spalte1) erweitern

 

xeres
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 21.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2015, 14:21     Titel: Matrix um definierte Zeitwerte (Spalte1) erweitern
  Antworten mit Zitat      
Hallo zusammen,

ich habe folgendes Problem:
Ich habe Datensätze mit Messwerten entsprechend der Matrix A(i,j). Da die Datensätze zur Darstellung zu gross sind (ich nutze Latex / tikzpictures) wollte ich diese Datensätze soweit reduzieren, dass sie ausschliesslich aus den maximalen Werten besteht. Für mich sind nur die y-Werte interessand die kleiner als y1 und grösser als y2 sind...


Folgendermassen habe ich das umgesetzt:

Code:
%zu vernachlässigendes intervall [y1 y2]
y1 = -15;
y2 = 15;

%Teile Matrix A in Zeit und Beschleunigungsvektor
t = A(:,1);
a_t = A(:,2);


%filtere beeschleunigungen so dass nur noch Peaks vorhanden

a_t1 = zeros(1, length(t));

for i=2:length(t)
   
    if (a_t(i) < y1 && a_t(i) < a_t(i-1) && a_t(i) < a_t(i+1))
       
        a_t1(i) = a_t(i);
       
    elseif (a_t(i) > y2 && a_t(i) > a_t(i-1) && a_t(i) > a_t(i+1))
       
        a_t1(i) = a_t(i);
       
    else
        a_t1(i) = 0;
       
    end
   
end


a_t1 = a_t1';

%erzeuge neue Matrix

V = [t a_t1];

%lösche alle nullzeilen in zweiter spalte der Matrix V
V(find(V(:,2) == 0),:) = [];



Mit dem letzten befehl konnte ich auch erfolgreich ALLE Zeilen löschen die in der zweiten Spalte eine Null enthalten.
Das Problem ist nun folgendes:

zur Darstellung ist es ungünstig das alle Zeilen (mit Null in Spalte 2) gelöscht werden.
Ich hätte gerne, dass vor und nach den überbleibenden Zeilen, die Zeile mit der Null bleibt.

Zur Verdeutlichung was ich habe und wo ich hin möchte habe ich zwei txt-files angehängt die meine maktellen file entsprechen (haben.txt) und was ich gerne hätte (will.txt)

würde mich freuen wenn mir hier jemand weiter helfen könnt.

ich hoffe ich konnte mein Problem einigermassen klar darstellen Embarassed
edit winkow: bitte code umgebung benutzen

will.txt
 Beschreibung:

Download
 Dateiname:  will.txt
 Dateigröße:  56 Bytes
 Heruntergeladen:  308 mal
habe.txt
 Beschreibung:

Download
 Dateiname:  habe.txt
 Dateigröße:  26 Bytes
 Heruntergeladen:  289 mal
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: 21.04.2015, 15:03     Titel: Re: Matrix um definierte Zeitwerte (Spalte1) erweitern
  Antworten mit Zitat      
Hallo xeres,

Es ist unpraktisch zwei so kleine Texte als Files im Forum zu posten. Man hat die als Leser dann in einem Editor offen, was das Lesen komplizierter macht.

Eigentlich sollte Dein Programm mit einem Fehler stoppen:
Code:
t = A(:,1);
a_t = A(:,2);  % a_t hat die gleiche Länge wie t

for i=2:length(t)    
    if (a_t(i) < y1 && a_t(i) < a_t(i-1) && a_t(i) < a_t(i+1))
% bei i==length(t) sollte a_t(i+1) ein Fehler sein?!
 

Wie wäre es damit:
Code:
n = length(t);
up   = a_t(2:n-1) > y2 & (a_t(2:n-1) > a_t(1:n-2) & a_t(2:n-1) > a_t(2:n));
down = a_t(2:n-1) < y1 & (a_t(2:n-1) < a_t(1:n-2) & a_t(2:n-1) < a_t(2:n));
a_t1 = a_t(up @ down);

Die Text-Files verstehe ich nicht. Was bedeuten die "x1, x2" etc?
Möchtest Du einfach zwischen zwei werten jeweils eine 0 einfügen?

Gruß, Jan
Code:

a_t1 = a_t1';

%erzeuge neue Matrix

V = [t a_t1];

%lösche alle nullzeilen in zweiter spalte der Matrix V
V(find(V(:,2) == 0),:) = [];



Mit dem letzten befehl konnte ich auch erfolgreich ALLE Zeilen löschen die in der zweiten Spalte eine Null enthalten.
Das Problem ist nun folgendes:

zur Darstellung ist es ungünstig das alle Zeilen (mit Null in Spalte 2) gelöscht werden.
Ich hätte gerne, dass vor und nach den überbleibenden Zeilen, die Zeile mit der Null bleibt.

Zur Verdeutlichung was ich habe und wo ich hin möchte habe ich zwei txt-files angehängt die meine maktellen file entsprechen (haben.txt) und was ich gerne hätte (will.txt)

würde mich freuen wenn mir hier jemand weiter helfen könnt.

ich hoffe ich konnte mein Problem einigermassen klar darstellen :oops:
edit winkow: bitte code umgebung benutzen[/quote]

Zuletzt bearbeitet von Jan S am 22.04.2015, 09:02, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
xeres
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 21.02.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.04.2015, 19:38     Titel:
  Antworten mit Zitat      
erstmal danke für die zügige Antwort!!!

sorry für die etwas unpraktische Darstellung meines Problems. Aber mir fällt es etwas schwer das Problem genau zu beschreiben. Wie man höchstwahrscheinlich sieht bin ich eine absolute Pfeife in MatLab, dies kommt noch erschwerend dazu :p

Zitat:
Eigentlich sollte Dein Programm mit einem Fehler stoppen:


ja das tut es wenn ich für i=1:length(t) eingebe.
mit i=2:length(t) konnte ich dies jedoch beheben. Da es danach funktioniert hat und die ausgegebenen Werte stimmen habe ich mir keine weiteren Gedanken dazu gemacht.

da ich deinen vorgeschlagenen Code nicht ganz verstehe habe ich ihn einfach mal eingefügt um zu sehen was passiert. jedoch erhalte ich eine Fehlermeldung:

Zitat:
Error using >
Matrix dimensions must agree.


ich denke aber, dass ich mein Ziel oder mein Problem nicht ganz klar machen konnte.

Ich lese meine Messdaten ein.
Zur Auswertung ist es wichtig die Maxima gegenüberzustellen. Darum habe ich erstmal alle Daten die kleiner als y1 und grösser als y2 sind mit Hilfe der for-Schleife genullt

Zitat:

for i=2:length(t)

if (a_t(i) < y1 && a_t(i) < a_t(i-1) && a_t(i) < a_t(i+1))

a_t1(i) = a_t(i);

elseif (a_t(i) > y2 && a_t(i) > a_t(i-1) && a_t(i) > a_t(i+1))

a_t1(i) = a_t(i);

else
a_t1(i) = 0;

end

end


Da ich zum einlesen in Latex nur einen begrenzten Speicher habe benötige ich alle Zeilen die A(:,2)=0 nicht. Darum habe ich sie mit

Zitat:

V(find(V(:,2) == 0),Smile = [];


gelöscht.

Dies verfälscht mir jedoch meine Darstellung, da ich jetzt grosse Zeitabschnitte deren y-Wert ic hgenullt habe. Daraus resultiert eine flache Steigung der Kurve.

Um diesen Fehler zu beheben würde ich gerne in der Matrix V, die aus n Zeilen besteht, vor und nach jeder Zeilte eine Zeile einfügen.
So dass in der zweiten Spalte eine 0 und in der ersten Spalte die zugehörige Zeit steht ( delta t ist bekannt).


Also wenn man das Problem auch anders lösen kann bin ich natürlich offen für Vorschläge
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.