2012-12-05 14 views
6

Ich habe eine StrukturMatlab: Wie Struct Felder "in Place" mit Struct Fun aktualisieren?

s.a = [1 2 3]; 
s.b = [2 3 4 5]; 
s.c = [9, 6 ,3]; 
s.d = ... % etc. - you got the gist of it 

Jetzt möchte ich auf die in jedem Feld gespeicherten Daten eine Funktion/Betrieb anzuwenden und der Inhalt des Feldes ändern, das heißt ich

s.a = myFun(s.a); 
s.b = myFun(s.b); 
s.c = myFun(s.c); % etc. ... 
anwenden möchten

Wie kann ich es tun, ohne explizit alle Felder wie oben beschrieben zu schreiben? Ich dachte an structfun - aber ich bin nicht so sicher, wie diese "in Place" Änderung zu erreichen ...

Vielen Dank!

Antwort

7

Für Ungeduldige Leser, die structfun Lösung am Ende meiner Antwort :-) Aber ich würde mich zuerst fragen ...

Was mit der Verwendung einer Schleife falsch? Das folgende Beispiel zeigt, wie es gemacht werden kann:

%# An example structure 
S.a = 2; 
S.b = 3; 

%# An example function 
MyFunc = @(x) (x^2); 

%# Retrieve the structure field names 
Names = fieldnames(S); 

%# Loop over the field-names and apply the function to each field 
for n = 1:length(Names) 
    S.(Names{n}) = MyFunc(S.(Names{n})); 
end 

Matlab Funktionen wie arrayfun und cellfun typischerweise are slower than an explicit loop. Ich denke, structfun leidet wahrscheinlich an dem gleichen Problem, also warum stören?

Wenn Sie jedoch auf der Verwendung structfun bestehen kann wie folgt vorgenommen werden (Ich habe das Beispiel ein wenig komplizierter nur die Allgemeinheit zu betonen):

%# structfun solution 
S.a = [2 4]; 
S.b = 3; 
MyFunc = @(x) (x.^2); 
S = structfun(MyFunc, S, 'UniformOutput', 0); 
+0

Sehr interessanter Punkt in Bezug auf die Laufzeit von 'cellfun' und 'arrayfun'. Ich bin immer noch mehr geneigt zu 'structfun', weil ich denke, dass es" eleganter "ist als loop. Ich denke auch, dass es zur Lesbarkeit des Codes beiträgt. Danke für Ihren Vorschlag! – Shai

+1

@Shai Fair genug. Ich habe meine Antwort aktualisiert, um eine 'structfun'-Lösung hinzuzufügen. Wenn Sie glauben, die Frage beantwortet zu haben, klicken Sie auf das Häkchen. Ansonsten lass es mich wissen und vielleicht kann ich es verbessern. Prost :-) –