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

Werte in einer Matrix filtern

 

cpo
Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 12:06     Titel: Werte in einer Matrix filtern
  Antworten mit Zitat      
Hallo zusammen,

ich habe folgendes Problem:

in einer Matrix (511 zeilen, 650 Spalten) befinden sich Werte zwischen -0.18 und 0.17.

Ich möchte nun alle Werte, die größer als 0.1 bzw. kleiner als -0.1 sind in eine neue Matrix gleicher Größe (511 Zeilen, 650 Spalten) übernehemen. Alle Werte die zwischen -0.1 und 0.1 liegen sollen in dieser durch Nullen ersetzt werden. Wie mache ich das?

Viele Dank für eure Hilfe
cpo
Private Nachricht senden Benutzer-Profile anzeigen


Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 12:49     Titel:
  Antworten mit Zitat      
Es gibt 100%ig eine besser Lösung, aber die hier sollte funktionieren:

Code:

[row,col] = find(abs(M)< 0.1)

for i=1:numel(row)
   M(row(i),col(i)) = 0;
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 13:12     Titel:
  Antworten mit Zitat      
Zenon hat Folgendes geschrieben:
Es gibt 100%ig eine besser Lösung


Jep ;) Man kann direkt die gesuchten Werte per logischem Vergleich identifizieren und das Ergebnis zur Indizierung der Matrix nutzen:

Code:

daten = rand(511, 650); %Deine Datenmatrix
daten_neu = zeros(size(daten)); %Neue Datenmatrix erzeugen (lauter nullen)
daten_neu(daten < -0.1 | daten > 0.1) = daten(daten < -0.1 | daten > 0.1); %gewünschte Daten an gewünschte Stellen kopieren
 


Etwas schneller ist es, wenn Du die unerwünschten Daten direkt in deiner Datenmatrix zu null setzen würdest, statt zuerst eine neue Matrix der selben Größe zu erzeugen und die Werte umzukopieren:

Code:

daten(daten > -0.1 & daten < 0.1) = 0;
 


Epfi
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 13:20     Titel:
  Antworten mit Zitat      
Genau an sowas hatte ich dann auch noch gedacht...

Code:

M(abs(M)<0.1) = 0;
 


Was davon wäre jetzt schneller?
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 13:40     Titel:
  Antworten mit Zitat      
Schleifen sind in Matlab üblicherweise die langsamere Option. -> Wo es möglich ist, vektoriell rechnen und indizieren.
Code:
M(abs(M)<0.1) = 0;
dürfte so etwa das schnellste sein.
Private Nachricht senden Benutzer-Profile anzeigen
 
cpo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 14:05     Titel:
  Antworten mit Zitat      
Super, das hat schonmal prima funktioniert! Noch eine kurze Ergänzungsfrage:

Hab den Code mal folgendermaßen modifizeirt:

Code:

input = ; %Deine Datenmatrix
output = zeros(size(input)); %Neue Datenmatrix erzeugen (lauter nullen)
upperlimit = 0.05;
lowerlimit = -0.05;
output(input < lowerlimit | input > upperlimit) = input(input < lowerlimit | input > upperlimit); %gewünschte Daten an gewünschte Stellen kopieren

figure;
imagesc(output);
caxis([lowerlimit upperlimit]);
 


Anstatt bei Input immer den Variablennamen einzugeben wäre es natürlich komfortabler die jeweilige Variable über ein GUI auszuwählen. Bei Dateien ist der Befehl dafür ja 'uigetfile'; gibt es das auch für Variablen (die sich im Workspace befinden)?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 13.04.2010, 14:20     Titel:
  Antworten mit Zitat      
Hallo
@cpo input ist ein reserviertes Wort, deswegen Verwendung als Variablennamen ist sehr gefährlich.
Private Nachricht senden Benutzer-Profile anzeigen
 
cpo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 7
Anmeldedatum: 05.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 14:27     Titel:
  Antworten mit Zitat      
ok, werde es in input_var umbenennen, danke für den Hinweis!

Gibt es trotzdem eine Möglichkeit die Variablen aus dem Workspace per GUI zu wählen?
Private Nachricht senden Benutzer-Profile anzeigen
 
Zenon
Forum-Guru

Forum-Guru


Beiträge: 292
Anmeldedatum: 20.01.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.04.2010, 14:53     Titel:
  Antworten mit Zitat      
Code:

ListWSvar = evalin('base','who');
 


Hiermit bekommst Du eine Liste aller gerade im MATLAB Workspace befindlichen Variablen. Die Liste könntest Du z.B. einen Listbox zuweisen mit der man dann die jeweiligen Variablen auslesen kann.

Code:

ListVar = who;
 


Hiermit bekommst Du die Variablen vom aktuellen Workspace.

Schau dir who und whos mal genauer an, man kann meine ich auch type einschränkungen machen.
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.