23

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

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

4

2 回答 2

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而根本没有循环。

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

于 2013-05-16T12:51:59.257 回答
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。第二种情况肯定会导致以下代码中的执行错误。而第一种情况有时可能会产生难以检测的错误。

于 2017-03-09T12:06:14.027 回答