2013-05-16 42 views
22

的「s{1}煩惱」的稱號是指在第一線內的塊如下:避免迭代單元陣列時出現「s {1}煩惱」?

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

s = s{1}企業是必要的,因爲迭代超過some_cell_array並沒有真正迭代的some_cell_array內容,但而不是1元件電池,每個包含來自some_cell_array的項目。

暫且不論誰可以可能希望這種行爲作爲默認這個問題,有沒有什麼辦法來遍歷的some_cell_array內容是什麼?

+0

我不想放棄「誰可能想要這種行爲」的問題! @#$%Matlab - 爲什麼?任何想法都是最受歡迎的。 – Shai

+0

@Shai(不要讓我開始......);-) – kjo

+0

沒有答案給你,但我覺得它在審美上稍微不像使用{{}}而不是{1}原因。 –

回答

17

我不認爲有一種方法可以在一般情況下避免此問題。但是如果你的單元格數組有全部數字或全部字符,那麼有一種方法。您可以轉換爲數組並讓for循環遍歷該數組。

例如,這樣的:

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

給出:

s = 
    1 
s = 
    2 
s = 
    3 

另一個選擇是創建在陣列的每一個細胞進行操作的功能。然後你可以簡單地打電話給cellfun,並且根本沒有循環。

我對誰會想要這種行爲或如何可能有用沒有任何意見。然而,我的猜測是爲什麼它以這種方式工作,這是一個實現的事情。這樣循環迭代器不會在不同的迭代中改變類型。即使該單元格的內容是不同的類型,它也是一個單元格。

+2

最後一段爲+1。 – Shai

+5

當'some_cell_array'的內容是字符串時,這似乎不起作用。 –

+0

@ H.Muster我沒有聲稱它可以用於字符串,只有字符。像'{'a','b','c'}'。 – shoelzer

4

只是Sam Robert對原始問題的評論的一個小插件,爲什麼你應該更喜歡s{:}而不是s{1}:更容易的錯誤跟蹤。

假設您錯誤地保存您的細胞s代替。然後

for s = some_cell_array 

只會返回一個細胞s這是等於some_cell_array。然後,語法s{1}將返回some_cell_array的第一個元素,而s{:}將生成some_cell_array中的所有元素的列表。第二種情況肯定會導致以下代碼中的執行錯誤。而第一種情況有時會產生一個難以察覺的bug。