2013-05-16 11 views
22

Der „s{1} Ärger“ des Titels in der ersten Zeile bezieht sich innerhalb des for-Block unter:Kann die "s {1} Belästigung" beim Iterieren über ein Zellenfeld vermieden werden?

for s = some_cell_array 
    s = s{1}; % unpeel the enclosing cell 
    % do stuff with s 
end 

Dieses s = s{1} Geschäft ist notwendig, da die Iteration über some_cell_array wirklich nicht über den Inhalt der some_cell_array laufen, aber eher über 1-Element Zellen, die jeweils einen Artikel von some_cell_array enthalten.

beiseite Putting die Frage, wer könnte möglicherweise dieses Verhalten alsStandard wollen, ist es eine Möglichkeit, über die nackten Inhalt some_cell_array iterieren?

+0

Ich möchte NICHT die Frage "wer könnte dieses Verhalten wollen" beiseite legen! @ # $% Matlab - warum? Ideen sind willkommen. – Shai

+0

@Shai (lass mich nicht anfangen ...) ;-) – kjo

+0

Keine Antwort für dich, aber ich finde es ästhetisch etwas weniger störend, 's {:}' statt 's {1}' zu benutzen Grund. –

Antwort

17

Ich glaube nicht, dass es eine Möglichkeit gibt, dieses Problem im allgemeinen Fall zu vermeiden. Aber es gibt einen Weg, wenn Ihr Zellenfeld alle Nummern oder alle Zeichen hat. Sie können in ein Array konvertieren und die for-Schleife darüber durchlaufen lassen.

Zum Beispiel diese:

some_cell_array = {1,2,3} 
for s = [some_cell_array{:}] % convert to array 
    s 
end 

Gibt:

s = 
    1 
s = 
    2 
s = 
    3 

Eine andere Möglichkeit ist, eine Funktion zu erstellen, die auf jede Zelle des Arrays arbeitet. Dann können Sie einfach cellfun anrufen und keine Schleife haben.

Ich habe keine Ideen darüber, wer dieses Verhalten oder wie es nützlich sein könnte. Meine Vermutung, warum es so funktioniert, ist jedoch, dass es eine Implementierung ist. Auf diese Weise ändert der Schleifeniterator den Typ bei verschiedenen Iterationen nicht. Es ist jedes Mal eine Zelle, auch wenn die Inhalte dieser Zelle verschiedene Typen sind.

+2

+1 für den letzten Absatz. – Shai

+5

Dies scheint nicht zu funktionieren, wenn der Inhalt von 'some_cell_array' Strings sind. –

+0

@ H.Muster Ich behauptete nicht, dass es für Strings funktionieren würde, nur Zeichen. Etwas wie '{'a', 'b', 'c'}'. – shoelzer

4

Nur ein kleines Add-on zu Sam Roberts Kommentar zur ursprünglichen Frage, warum Sie s{:} über s{1} bevorzugen sollten: einfacheres Bug-Tracking.

Imagine Sie Ihr Handy s als Spalte anstelle einer Linie versehentlich gespeichert. Dann

for s = some_cell_array 

einfach zurückgeben eine Zelle s die gleich-some_cell_array ist. Dann gibt die Syntax s{1} das erste Element some_cell_array zurück, während s{:} eine Liste aller Elemente in some_cell_array erzeugt. Dieser zweite Fall wird im folgenden Code viel sicherer zu einem Ausführungsfehler führen. Während der erste Fall manchmal einen harten Fehler zur Entdeckung verursachen könnte.

Verwandte Themen