2013-05-16 20 views
22

Il "s{1} fastidio" del titolo si riferisce alla prima linea all'interno del per-blocco sotto:Si può evitare il "s {1} fastidio" quando si itera su un array di celle?

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

è necessario Questa s = s{1} business perché l'iterazione su some_cell_array realtà non scorrere i contenuti di some_cell_array, ma piuttosto su 1 elemento celle, ciascuna contenente un articolo da some_cell_array.

Mettendo da parte la questione di chi potrebbe possibilmente desiderare questo comportamento come predefinito , c'è un modo per scorrere i nude contenuto di some_cell_array?

+0

Vorrei NON mettere da parte la domanda "chi potrebbe desiderare questo comportamento"! @ # $% Matlab - perché? tutte le idee sono le benvenute. – Shai

+0

@Shai (non farmi iniziare ...) ;-) – kjo

+0

Nessuna risposta per te, ma trovo esteticamente un po 'meno fastidioso usare 's {:}' piuttosto che 's {1}', per alcuni ragionare. –

risposta

17

Non credo che ci sia un modo per evitare questo problema nel caso generale. Ma c'è un modo se il tuo array di celle ha tutti i numeri o tutti i caratteri. È possibile convertire in un array e lasciare che il ciclo for iterato su quello.

Ad esempio, questo:

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

esprime:

s = 
    1 
s = 
    2 
s = 
    3 

Un'altra opzione è quella di creare una funzione che opera su ogni cella dell'array. Quindi puoi semplicemente chiamare cellfun e non avere un loop.

Non ho idee su chi vorrebbe questo comportamento o come potrebbe essere utile. La mia ipotesi sul perché funzioni in questo modo, tuttavia, è che è un'implementazione. In questo modo l'iteratore di loop non cambia tipo in diverse iterazioni. È una cella ogni volta, anche se i contenuti di quella cella sono di tipo diverso.

+2

+1 per l'ultimo paragrafo. – Shai

+5

Questo non sembra funzionare quando i contenuti di 'some_cell_array' sono stringhe. –

+0

@ H.Muster Non ho affermato che avrebbe funzionato per le stringhe, solo caratteri. Qualcosa come '{'a', 'b', 'c'}'. – shoelzer

4

Solo un piccolo add-on per il commento di Sam Robert alla domanda originale, sul perché si dovrebbe preferire s{:} su s{1}: più facile bug tracking.

immaginate di errore memorizzato tuo cellulare s come colonna invece di una linea. Poi

for s = some_cell_array 

restituirà semplicemente una cellula che è spari asome_cell_array. Quindi la sintassi s{1} restituirà il primo elemento di some_cell_array, mentre s{:} produrrà un elenco di tutti gli elementi in some_cell_array. Questo secondo caso determinerà sicuramente un errore di esecuzione nel seguente codice. Mentre il primo caso potrebbe a volte creare un bug difficile da rilevare.

Problemi correlati