2013-05-16 19 views
22

W „s{1} kłopot” w tytule odnosi się do pierwszej linii w obrębie do bloku poniżej:Czy można uniknąć "irytacji" {1} podczas iteracji na macierzy komórkowej?

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

Ten s = s{1} firma jest konieczne, ponieważ iteracja nad some_cell_array naprawdę nie iteracyjne nad zawartością some_cell_array, ale raczej ponad 1-elementowymi komórkami, z których każdy zawiera element z some_cell_array.

Pomijając kwestię, kto mógłby ewentualnie chcą to zachowanie jako domyślnie, czy jest jakiś sposób, aby iteracyjne nad gołymi zawartości some_cell_array?

+0

Nie chciałbym odkładać na bok pytania "kto może chcieć tego zachowania"! @ # $% Matlab - dlaczego? wszelkie pomysły są mile widziane. – Shai

+0

@Shai (nie zaczynaj mnie ...) ;-) – kjo

+0

Brak odpowiedzi dla ciebie, ale uważam, że estetycznie nieco mniej irytujące jest użycie 's {:}' zamiast 's {1}', dla niektórych powód. –

Odpowiedz

17

Nie sądzę, że istnieje sposób na uniknięcie tego problemu w ogólnym przypadku. Ale jest sposób, jeśli tablica twoich komórek zawiera wszystkie liczby lub wszystkie znaki. Możesz przekonwertować na tablicę i pozwolić na iterację pętli for.

na przykład następująco:

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

otrzymujemy:

s = 
    1 
s = 
    2 
s = 
    3 

Inną opcją jest tworzenie funkcji, które działają w każdej komórce tablicy. Następnie możesz po prostu zadzwonić pod numer cellfun i nie mieć w ogóle pętli.

Nie mam żadnych pomysłów na temat tego, kto chciałby tego zachowania i jak może być użyteczny. Zgaduję, dlaczego to działa w ten sposób, ale jest to rzecz implementacji. W ten sposób iterator pętli nie zmienia typu w różnych iteracjach. Jest to komórka za każdym razem, nawet jeśli zawartość tej komórki jest innego rodzaju.

+2

+1 dla ostatniego akapitu. – Shai

+5

To nie działa, gdy zawartość 'some_cell_array' są ciągami. –

+0

@ H.Muster Nie twierdziłem, że będzie działać dla ciągów znaków, tylko znaków. Coś jak '{'a', 'b', 'c'}'. – shoelzer

4

Tylko niewielki dodatek do komentarza Sam Roberta do pierwotnego pytania, dlaczego warto wybrać s{:} przez s{1}: łatwiejsze śledzenie błędów.

Wyobraź sobie błędnie przechowywane komórki s jako kolumna zamiast linii. Następnie

for s = some_cell_array 

po prostu wrócić komórkę s który jest równa do some_cell_array. Wtedy składnia s{1} zwróci pierwszy element z some_cell_array, podczas gdy s{:} stworzy listę wszystkich elementów w some_cell_array. Ten drugi przypadek z dużym prawdopodobieństwem doprowadzi do błędu wykonania w następującym kodzie. Podczas gdy pierwszy przypadek może czasami stworzyć trudny do wykrycia błąd.

Powiązane problemy