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

Teil eines Vektors auslesen und neu zusammensetzen

 

Stromberg
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.11.2014, 00:32     Titel: Teil eines Vektors auslesen und neu zusammensetzen
  Antworten mit Zitat      
Hallo,

ich bin Matlab Anfänger und habe folgendes Problem:

Ich habe einen Vektor A mit n Werten. Der Werteverlauf des Vektors A gleicht einer nach oben geöffneten Parabel. Ein vordefinierter Grenzwert ist X.

Ich möchte gerne einen neuen Vektor B mit n Werten definieren:

Jeder Wert des Vektors A soll überprüft werden, ob dieser kleiner als der Grenzwert X ist. Falls ja, soll der Wert des Vektors A bestehen bleiben, falls nein, soll der Grenzwert X an dessen Stelle geschrieben werden.

Kann mir hier bitte jemand weiterhelfen?
Private Nachricht senden Benutzer-Profile anzeigen


Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 04.11.2014, 02:35     Titel:
  Antworten mit Zitat      
Hallo,

Das geht sehr einfach mittels eines logischen Vektors.

Code:
n = 20;
A = rand(n,1);
X = 0.5;

log_A = A < X;  % 1 für Werte < X, sonst 0
A(log_A) = X;   % Werte von A ersetzen, bei denen log_A gleich 1 ist

% in kurz
% A(A < X) = X;


Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Stromberg
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.11.2014, 21:12     Titel:
  Antworten mit Zitat      
Hallo und Danke für die schnelle Antwort.

Ich würde gerne dem "neuen" Vektor A als Vektor B deklarieren.

Hast Du hierfür noch einen Tipp?
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 05.11.2014, 21:42     Titel:
  Antworten mit Zitat      
Gern geschehen.

Setze
Code:
und wende die Berechnungen auf B statt A an, dann wird A nicht überschrieben.

Grüße
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Stromberg
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2014, 00:23     Titel:
  Antworten mit Zitat      
Super, Danke.

Abschließend würde ich gerne ausschließlich die Messwerte unterhalb des Grenzwertes des neu definierten Vektors mit der Funktion

Code:


glätten, so dass ein zusammengesetzter Vektor aus konstantem Grenzwertbereich, gefilterter Bereich und konstantem Grenzwertbereich entsteht (s. Anhang).

Die Glättungsfunktion habe ich bereits für nicht modifizierte Messdaten angewandt. In diesem Fall gelingt mir aber die Bereichsdefinition nicht.

Hättest Du hier noch einen Tipp?

Filter.png
 Beschreibung:

Download
 Dateiname:  Filter.png
 Dateigröße:  35.23 KB
 Heruntergeladen:  385 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 06.11.2014, 00:46     Titel:
  Antworten mit Zitat      
Hi,

Auch das geht, sofern ich dich richtig verstehe, mit Hilfe des logischen Vektors:
Code:
n = 20;
A = rand(n,1);
B = A;
X = 0.5;

log_B = B < X;  % 1 für Werte < X, sonst 0
C = log_B .* B; % Nur Werte für die log_B 1 ist; Restl. Werte sind 0
D = B(log_B);   % Nur Werte für die log_B 1 ist; Restl. Werte aus Vektor entfernt


Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Stromberg
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.11.2014, 02:40     Titel:
  Antworten mit Zitat      
Nein, nicht ganz Wink

Ich muss nochmal von vorne anfangen.

Ich habe eine Matrix A mit 4 Spalten und n Zeilen mit Messwerten. Der Verlauf der Spalten stellt in Annäherung eine nach oben geöffnete Parabel dar. Für diese Matrix A wird eine Grenze X als cut definiert. Ich möchte ausschließlich die Werte der Matrix unterhalb der Grenze X glätten. Der Bereich links und rechts soll hierbei nicht mehr vorhanden sein (auch nicht 0), da dies sonst aufgrund der Unstetigkeiten im Übergang zu Überschwingern führt. Somit glätte ich einen Bereich der Matrix A mit n-y Zeilen.

Nach dem Glätten möchte ich gerne wieder eine Matrix mit n Zeilen haben. D. h. der geglättete Bereich (Parabellausschnitt) soll links und rechts wieder mit dem Grenzwert X ergänzt werden, so dass eine zusammengesetzte und geglättete Matrix mit n Zeile ohne Horizontalversatz entsteht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 06.11.2014, 05:34     Titel:
  Antworten mit Zitat      
Wie gesagt, auch das geht mittels logischer Indizierung:
Code:
% Beispieldaten erzeugen
x = (-5:0.2:5)';
err1 = rand(size(x));
err2 = rand(size(x));
test=err1;
err1(err2 < 0.5) = (-1) .* err1(err2 < 0.5);
a = (x+0.3*err1).^2;

% Cut
X = 10;

% Daten >=X gleich X setzen ...
b = a;
log = b >= X;
b(log) = X;  

% ... und Daten <X filtern
c = b;
c(~log) = sgolayfilt(c(~log), 3, 31);

% Plots
figure
plot(x,a)
figure
plot(x,b)
figure
plot(x,c)


Grüße
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Stromberg
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.11.2014, 01:10     Titel:
  Antworten mit Zitat      
Vielen Dank!

Ich bin begeistert und habe viel dazu gelernt!
Private Nachricht senden Benutzer-Profile anzeigen
 
Stromberg
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.03.2015, 17:35     Titel:
  Antworten mit Zitat      
Hallo,

ich würde gerne neben dem bereits erfolgreichen Beschneiden und Filtern im relevanten Bereich noch die Ableitung bilden, d. h. aus dem Weg die Geschwindigkeit ableiten.

Mit dem Einsatz des logischen Vektors komme ich hier nicht weiter, da durch "diff" sich die Anzahl der Datenpunkte um -1 reduziert.

Kann mir hier jemand weiterhelfen?

Zusammengefasst möchte ich gerne aus einem Teil eines Wegsignals die Geschwindigkeit ermitteln, in dem ich den Teilbereich nach der Zeit ableite. Die Bereich haben einen konstanten Weg bzw. hier soll die Geschwindigkeit 0 sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 11.03.2015, 07:15     Titel:
  Antworten mit Zitat      
Hallo Stromberg,

Stromberg hat Folgendes geschrieben:
Mit dem Einsatz des logischen Vektors komme ich hier nicht weiter, da durch "diff" sich die Anzahl der Datenpunkte um -1 reduziert.

Bsp. einer Ableitung mit diff:
Code:
h = 0.1;
x = -5:h:5;
y = x.^2;

xd = (x(1:end-1) + x(2:end)) ./ 2;  % um 1 kürzer als x
yd = diff(y) ./ h;% ./ diff(x);

plot(x,y,'r')
hold on
plot(xd,yd,'b')

Grüße,
Seban
_________________

Richtig fragen
Debugging
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: 11.03.2015, 11:02     Titel:
  Antworten mit Zitat      
Hallo Stromberg,

Statt DIFF eigenet sich GRADIENT besser für eine Ableitung. Einerseits verändert es nicht die Anzahl von Datenpunkten, zweitens wird der numerisch stabilere zweiseitige Differenzen-Quotient verwendet.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.03.2015, 11:49     Titel:
  Antworten mit Zitat      
Hallo,

vielen Dank für die Vorschläge. Ich werde diese ausprobieren.
Private Nachricht senden Benutzer-Profile anzeigen
 
Stromberg
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 58
Anmeldedatum: 13.10.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.03.2015, 16:58     Titel:
  Antworten mit Zitat      
Hat prima funktioniert und ist eine effiziente Lösung!

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