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

Wertebereiche von Matrix abschneiden

 

M1CH

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.12.2007, 18:21     Titel: Wertebereiche von Matrix abschneiden
  Antworten mit Zitat      
Hi!

Kennt hier vielleicht jemand eine Möglichkeit, schnell in Matlab bestimmte Werte "abzuschneiden".
z.B: Ich habe eine Matrix und möchte alle Werte die kleiner als 0 und grösser als 1 sin auf Null setzen. Die anderen Werte sollen gleich bleiben.

THX, M1CH


Ernesto Figueira
Forum-Newbie

Forum-Newbie


Beiträge: 2
Anmeldedatum: 04.12.07
Wohnort: Hannover
Version: ---
     Beitrag Verfasst am: 05.12.2007, 18:51     Titel:
  Antworten mit Zitat      
Sei a Ihre Matrix ist!
Dann
a.*(a>=0).*(a<=1)
ist die gewünschte Matrix.
Beispiel
a =

1 0.5 3
-1 0.24 0.9
1.1 -0.1 2

>> a.*(a>=0).*(a<=1)

ans =

1 0.5 0
0 0.24 0.9
0 0 0
Private Nachricht senden Benutzer-Profile anzeigen
 
jochma
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 79
Anmeldedatum: 25.10.07
Wohnort: Oberbayern
Version: Version 7.0.0 (R14)
     Beitrag Verfasst am: 05.12.2007, 18:54     Titel:
  Antworten mit Zitat      
Servus,
würd für eine Matrix A z.B. so funktionieren:

Code:

i=find(A<0);
k=find(A>1);
A(i)=0;
A(k)=0;
 


Gruß,
jochma
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 05.12.2007, 18:54     Titel:
  Antworten mit Zitat      
Hallo M1CH,

das funktioniert mit "Logical Indexing":

Code:
Matrix = 4*(rand(5,5)-0.5)
Matrix(Matrix<0|Matrix>1) = 0


Herzliche Grüße
Bijick

PS: Und jetzt die Lieblingslösung aussuchen! Laughing
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2011, 11:40     Titel:
  Antworten mit Zitat      
Hallo...

Gibt es auch die Möglichkeit diese Werte nicht auf 0 zu setzen sondern wirklich abzuschneiden? Sprich die Matrix zu verkleinern?

Gruess adi
 
EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 26.04.2011, 11:46     Titel:
  Antworten mit Zitat      
Da wirds dann "interessanter" Smile
Ist es eine Matrix oder ein Vektor?

Möglich wäre das durchlaufen aller Elemente in einer Schleife, überprüfen auf die gewünschte Bedingung (hier < 0 oder > 1) und wenn diese (hier) nicht erfüllt ist, das ganze in eine/n neue/n Matrix/Vektor schreiben.
Das Problem bei der Matrix könnte sein, dass in zwei Spalten/Zeilen unterschiedlich viele Elemente ausgeschnitten werden und eine Spalte dann mehr Elemente als eine andere hat bzw. eine Zeile. Die restlichen Elemente müssten hier auf jedenfall dann mit einem Wert (z.B. 0) gefüllt werden.
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2011, 12:00     Titel:
  Antworten mit Zitat      
Es ist einfacherweise nur ein Vektor (1 x 1305). Wie kann man so eine abfragende Schlaufe generieren? Hab drum noch keine Erfahrung mit solchen Schlaufen bzw. ich krieg sie noch nicht recht hin...

Gruess
 
EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 26.04.2011, 12:14     Titel:
  Antworten mit Zitat      
1. Schleifen, nicht Schlaufen Wink

2. Wenn du mehr mit Matlab arbeitest unbedingt Schleifen anschauen (allgemein Programmierung). Sind sehr einfach, aber essentiell!

3. Probiers hiermit: (sehr ineffektiver Code, aber auf die schnelle fiel mir nix besseres ein - sollte aber klappen)

Code:

% Erzeuge 100-Spalten langen Vektor mit Zufallszahlen zwischen -1 und +2:

a = -1;
b = 2;
Vektor = a + (b-a).*rand(1,100);

% Initialisiere Zwischenspeicherungs-Vektor mit einer Null

ZwischenVektor(1) = 0;

% Durchlaufen in einer Schleife und alle Werte < 0 oder > 1 wegschneiden
% anders gesagt: wenn die Zahl >= 0 und gleichzeitig <= 1 ist, übernehmen wir
% sie in den Zwischenspeicher (einfach unten anhängen)

for ElementNr = 1:length(Vektor)
   if ( Vektor(ElementNr) >= 0 && Vektor(ElementNr) <= 1 )
      ZwischenVektor(end+1) = Vektor(ElementNr);
   end
end

% erste Zeile wird weggeschnitten und in neuen Vektor gespeichert
% und der Zwischenspeicher gelöscht

NeuerVektor = ZwischenVektor(2:end);
clear ZwischenVektor ElementNr a b;
 


Edit: angepasst so dass es mit Zeilenvektor und Spaltenvektor klappen sollte.
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.04.2011, 13:55     Titel:
  Antworten mit Zitat      
Ich verstehe was du machst ausser das beim Zwischenvektor (end + 1) steht...

was passiert da genau?
 
EliteTUM
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 70
Anmeldedatum: 21.04.11
Wohnort: München
Version: ---
     Beitrag Verfasst am: 26.04.2011, 14:57     Titel:
  Antworten mit Zitat      
Die Schreibweise

Code:
Zwischenvektor(end)


greift auf das letzte Element von Zwischenvektor zu. Wir wollen aber eins hinzufügen (hinten anhängen), also nehmen wir das Element end+1. OK?
_________________

- EliteTUM
_____________________________________
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 26.04.2011, 22:12     Titel:
  Antworten mit Zitat      
Hallo,
das ganze ohne Schleife:
Code:

a = -1;
b = 2;
Vektor = a + (b-a).*rand(1,100);

Zwischenvektor = Vektor(Vektor >= 0 & Vektor <= 1)
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2011, 12:03     Titel:
  Antworten mit Zitat      
Habe jetzt den Code umgeschrieben auf meine Situation:

I = H(H > 0 & H < 2)

Wobei H der Vektor ist mit den Zahlen und den vielen 0

und I ist mein Zielvektor indem nur noch die Zahlen sind. Jedoch ist nun der Vektor "leer", Obwohl in H Zahlen zwischen 0 und 1 vorkommen, wieso?

Gruess und Danke
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.04.2011, 12:12     Titel:
  Antworten mit Zitat      
Habs geschafft danke...

Es lag an der Obergrenze weil die Zahlen in 1000er gespeichert war...


Danke nochmals!!!
 
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.