2016-05-14 15 views
2

In MATLAB möchte ich ein verschachteltes Feld für jeden Index einer 1 x n-Struktur (eine nicht skalare Struktur) extrahieren und die Ausgabe als ein 1 x n-Zellenarray erhalten. Als ein einfaches Beispiel an, dass ich mit der folgenden Struktur s starten:In MATLAB: Wie sollten verschachtelte Felder einer Struktur in ein Zellenfeld konvertiert werden?

s(1).f1.fa = 'foo'; 
s(2).f1.fa = 'yedd'; 
s(1).f1.fb = 'raf'; 
s(2).f1.fb = 'da'; 
s(1).f2 = 'bok'; 
s(2).f2 = 'kemb'; 

Ich kann meinen Wunsch 1 x 2 Zellenarray C unter Verwendung eines produzieren for-Schleife:

n = length(s); 
c = cell(1,n); 
for k = 1:n 
    c{k} = s(k).f1.fa; 
end 

Wenn ich tun wollte analog für ein nicht verschachteltes Feld, zum Beispiel f2, dann könnte ich "vectorize" die Operation (siehe this question), das Schreiben einfach:

c = {s.f2}; 

Derselbe Ansatz scheint jedoch für verschachtelte Felder nicht zu funktionieren. Was sind dann Möglichkeiten, die obige For-Schleife zu vektorisieren?

Antwort

2

Sie können es nicht wirklich vektorisieren. Das Problem ist, dass Matlab die meisten Formen der geschachtelten Indexierung nicht zulässt, einschließlich []..

Die knappste/lesbare Option s.f1 ergibt eine Struktur Array [...] und dann Index in die neue Struktur Array mit einem separaten Anruf würde verketten:

x = [s.f1]; c = {x.fa}; 

Wenn Sie ein Mapping Toolbox haben, Sie extractfield verwenden könnte die zweite Indizierung in einem Ausdruck auszuführen:

c = extractfield([s.f1], 'fa'); 

Alternativ könnten Sie schreiben einen Einzeiler mit arrayfun - hier ein paar Optio ns:

c = arrayfun(@(x) x.f1.fa, s, 'uni', false); 
c = arrayfun(@(x) x.fa, [s.f1], 'uni', false); 

Beachten Sie, dass arrayfun und ähnliche Funktionen sind in der Regel langsamer als explizite for Schleifen. Wenn die Leistung kritisch ist, sollten Sie Ihren Code zeit-/profilieren, bevor Sie eine Entscheidung treffen, die Schleife loszuwerden.

Verwandte Themen