可以避免在迭代单元阵列时“s {1}烦恼”吗?

时间:2013-05-16 12:33:54

标签: matlab loops for-loop

标题的“s{1}烦恼”是指以下for-block中的第一行:

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

2 个答案:

答案 0 :(得分: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而根本没有循环。

我不知道谁会想要这种行为或者它有什么用处。然而,我猜测它为什么会以这种方式工作,这是一个实现的东西。这样循环迭代器不会在不同的迭代上改变类型。它每次都是一个单元格,即使该单元格的内容是不同的类型。

答案 1 :(得分: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中所有元素的列表。第二种情况肯定会导致以下代码中的执行错误。而第一种情况有时会产生难以检测的难题。