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

Filtern von allen Matrices in struct array

 

Gast14896

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2017, 10:12     Titel: Filtern von allen Matrices in struct array
  Antworten mit Zitat      
Hallo,

ich habe eine Vielzahl von Variablen aus einem .txt file gelesen und diese in einem struct array gespeichert (ich wollte einzelne Matrices umgehen da es sich um sehr viele Variablen handelt und struct sehr übersichtlich ist).

Bsp.:
Code:

Data1.VarA = rand(10);
Data1.VarB = rand(10);
Data1.VarC = rand(10);

% ... usw
 


Ich möchte die einzelnen Matrices (nicht alle sind double, wegen Namen etc sind auch cells dabei) im folgenden mit bestimmen Kritrien z.B. Min und Max filtern.

Für eine einzelne Matrix würde ich also
Code:

mini = .2;
maxi = .6;

Data1.VarA(Data1.VarA > maxi | Data1.VarA < mini) = 0;
 


Das Ganze würde ich gerne automatisch für das komplette struct machen (ausgenommen den cell arrays). Gibt es hier eine Hilfreiche Funktion?
Am besten wäre außerdem, wenn ich die einzelnen Variablen nicht tippen müsste (sind einige 100), sondern nur sagen:

nehme das struct von variablen 1 bis 100 und prüfe die mini und maxi (die ich dann eben als Vektor definieren würde, da jede Variable andere Grenzwerte aufweist. Ich habe es bereits mit einem for-loop versucht, allerdings muss ich die Variablennamen verwenden.

Vielen Dank für eure Hilfe!


Gast14896

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2017, 11:33     Titel: structfun
  Antworten mit Zitat      
Ich kann mittels structfun folgendes prüfen:

Code:

B = structfun(@(x) (x<mini | x>maxi), Data1, 'UniformOutput',0);
 


was im Prinzip genau das macht, was ich wollte. Allerdings würde ich gerne für das erste Feld im Struct mit mini=.2 und maxi=.6, für das zweite Feld aber z.B. mini=.6, maxi=.75.

Is das möglich?

Außerdem: Wie kann ich die logical arrays in B anschließend nutzen um Data1 zu filtern? Bisher ging das relativ einfach über logical indexing... z.B. Data1(~B)=0
Wie funktioniert das mit struct?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.02.2017, 12:01     Titel: Re: structfun
  Antworten mit Zitat      
Hallo Gast14896,

Die structfun bezieht sich auf alle Felder, Du wolltest aber nur die numerischen Inhalte bearbeiten, oder?
"Einige 100" Felder ist ungewöhnlich viel. Kann man die numerischen Daten nicht in numerischen Arrays zusammen fassen? Das würde die Arbeit deutlich vereinfachen.

Du kannst einen Struct effizient in ein Cell umwandeln, und dann Indices verwenden:
Code:
C = struct2cell(Data1);
B = true(size(C));
B(1) = C{1} < 0.2 | C{1} > 0.6;
for k = 2:numel(C)
  B(k) = C{k} < 0.6 | C{k} > 0.75;
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast14896

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2017, 12:26     Titel: re
  Antworten mit Zitat      
Lieber Jan,

danke für die schnelle Antwort.

Ich habe angefangen mit numerischen Arrays zu arbeiten. Da alle Variablen die gleiche Dimension haben, war das soweit auch super. Ich hatte diese in einem Array mit (x,y,n) zusammengefasst (wobei n die Anzahl der Variablen war). Außderdem ein Vektor der Länge n um min und max zu filtern.

Beim struct habe ich den Vorteil, dass ich sehr einfach gruppieren kann und sofort weiß, in welcher Matrix welche Info steckt. Beim numerischen Arrays muss ich immer wieder händisch prüfen "was war nochmal matrix (:,:,78 )"

Ich könnte auch einfach über
Code:

structfun(@(x) ~isnumeric(x), Data1);
 


die nicht-numerischen Felder entfernen (wenn es dann einfacher wäre). Am schönsten wäre für mich, wenn ich ebenfalls ein Filterstruct hätte, also analog zu oben

Code:

Filter1.VarA = [.2 .6];
Filter1.VarB = [.6 .75];
Filter1.VarC = [.9 .95];
%usw
 


und dann jede Matrix mit dem jeweiligen Filter prüfen. Gibt es hier eine einfache Möglichkeit oder würdest du ein rein numerisches Format vorteilhafter finden?

Danke!
 
Gast14896

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2017, 12:50     Titel: re
  Antworten mit Zitat      
ich könnte folgendes versuchen:

Code:

% Namen der Felder
names = fieldnames(Data1);

for k = 1:length(names)

Matrix = getfield(Data1, names{k})

% jetzt könnte ich diese wie mit dem gewohnten Indexing nacheinander filtern und anschließend wieder im struct ablegen

end

 


Ist das zu umständlich?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 06.02.2017, 12:36     Titel: Re: re
  Antworten mit Zitat      
Hallo,

Oder mit "dynamic fieldnames" statt getfield :
Code:
names = fieldnames(Data1);
for k = 1:length(names)
  Matrix = Data1.(names{k});
  ...
end

Gruß, Jan
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.