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

Komponente in Struktur in Struktur ohne Schleife prüfbar?

 

Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 06.01.2013, 12:53     Titel: Komponente in Struktur in Struktur ohne Schleife prüfbar?
  Antworten mit Zitat      
Hallo,

Ich greife auf Strukturen zu, die wiederum in Strukturen gespeichert sind, um zu prüfen, ob sie eine bestimmte Komponente enthalten:

Code:

tmp_names    = fieldnames(struct_1);
time_exists   = zeros(1, tmp_names);

for i = 1:length(tmp_names)
    tmp_1    = eval(['struct_1.' tmp_names{i} ';']);
    tmp_2    = eval(['struct_2.' tmp_names{i} ';']);
   
    if isfield(tmp_1,'time') && isfield(tmp_2,'time')
      time_exists(i) = 1;
    end
end


Erläuterung:
tmp_names: nx1 cell, enthält strings
struct_1 & struct_2: 1x1 struct, enthalten wiederum n 1x1 struct
tmp_1 & tmp_2: 1x1 struct, Vorkommen n mal, enthalten mehrere Komponenten

Ist es möglich (und sinnvoll) auf andere Weise zu prüfen, ob die n Strukturen tmp_1 & tmp_2 die Komponente time enthalten, ohne auf eine Schleife zurückzugreifen? Bspw. indem man eine Funktion ähnlich wie isfield nicht nur auf eine Struktur anwendet, sondern auf mehrere Strukturen gleichzeitig?

Beste Grüße & Dank an alle, die sich Gedanken machen wollen Very Happy
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen


Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2013, 15:21     Titel:
  Antworten mit Zitat      
Hallo Seban,

benutze bitte kein eval.
Richtig heißt es
Code:
tmp_1 = struct_1.(tmp_names{i});


so gehts:
Code:
time_exists = structfun(@(el)isfield(el,'time'),struct_1) && structfun(@(el)isfield(el,'time'),struct_2);



Grüße
Sirius
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: 07.01.2013, 01:44     Titel: Re: Komponente in Struktur in Struktur ohne Schleife prüfba
  Antworten mit Zitat      
Hallo Seban,

Ich würde es bei einer Schleife lassen.

Code:
tmp_names = fieldnames(struct_1);
time_exists   = false(1, tmp_names);

for i = 1:length(tmp_names)
    time_exists(i) = and(isfield(struct_1.(tmp_names{i}), 'time'), ...
                                isfield(struct_2.(tmp_names{i}), 'time'));
end

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

Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.01.2013, 02:10     Titel:
  Antworten mit Zitat      
Hallo & vielen Dank für eure Hilfe!

zu eval:
Das stammt noch von meinem Vorgänger. Ich wollte das heute auch schon ersetzen und hatte
Code:
tmp_1 = struct_1.tmp_names{i};

probiert (ohne ()), das führte zu einer Fehlermeldung. Jetzt wo ich es bei euch mit Klammern sehe, nehme ich an, Matlab kann die {i} nicht korrekt dem tmp_names zuordnen, wenn die () fehlen (?). Muss ich das nicht mehr weiter nachverfolgen. Danke dafür Very Happy


zur Prüfung der Strukturen:
Ich denke, ich belasse es bei einer Schleife, das ist leichter nachzuvollziehen (An dem Projekt arbeiten großteils HiWis, die Matlab-Programmierung (mich eingeschlossen) learning by doing gelernt haben & immer noch lernen und soweit ich weiß keine Informatiker, daher auch meine vielleicht etwas trivialen Fragen im Laufe der Zeit Embarassed ).

Aber ein paar Fragen zu euren Möglichkeiten:
zu Sirius3s Vorschlag: Ist das eine anonyme Funktion und wird diese el mal aufgerufen? Hab ich gestern das erste mal kurz was zu gelesen, auf die Idee wäre ich um ehrlich zu sein nicht gekommen.

zu Jans Vorschlag: Hat
Code:
and(Bedingung1, Bedingung2)

einen Vorteil ggü.
Code:
Bedingung1 && Bedingung2

?

Beste Grüße & danke nochmals
_________________

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: 07.01.2013, 11:45     Titel:
  Antworten mit Zitat      
Hallo Seban,

Code:
tmp_1 = struct_1.tmp_names{i};

Das wäre korrekt, wenn das Feld "tmp_names" heißt und ein Cell ist. Wenn Du aber den Inhalt von "tmp_names{i}" möchtest, sind die Klammern notwendig.

Code:
and(Bedingung1, Bedingung2)
Bedingung1 && Bedingung2

Beides ist equivalent und damit eine Frage des Geschmacks.
Einen Unterschied macht es, wenn die zweite Bedingung eine Funktion mit Seiten-Effekten ist. Denn && ruft den rechten Teil nicht auf, falls der erste Teil bereits FALSE ist.

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

Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.01.2013, 14:58     Titel:
  Antworten mit Zitat      
Dank dir.
_________________

Richtig fragen
Debugging
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.