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