可以避免迭代单元格数组时的“s1 烦恼”吗?

Posted

技术标签:

【中文标题】可以避免迭代单元格数组时的“s1 烦恼”吗?【英文标题】:Can the "s1 annoyance" when iterating over a cell array be avoided?可以避免迭代单元格数组时的“s1 烦恼”吗? 【发布时间】:2013-05-11 08:29:44 【问题描述】:

标题的“s1 annoyance”指的是下面for-block中的第一行:

for s = some_cell_array
    s = s1;  % unpeel the enclosing cell
    % do stuff with s
end

这个s = s1 业务是必要的,因为对some_cell_array 的迭代并没有真正迭代some_cell_array 的内容,而是在1 元素单元格 上迭代,每个单元包含来自@ 的项目987654326@.

抛开谁可能可能希望这种行为作为默认的问题,有没有办法迭代bare的内容some_cell_array?

【问题讨论】:

我不想搁置“谁可能想要这种行为”的问题! @#$​​% Matlab - 为什么?欢迎任何想法。 @Shai(别让我开始......);-) 另外:我觉得更烦人的是你不能使用for s = some_cell_array:。那将是一个很好的语法。不幸的是,FOR expression comma separated list must have exactly one item. @Shai:我认为默认情况下与常规数组的 for 循环工作方式保持一致(Matlab 在维度 2 上循环)。为了能够在 元胞数组 的维度 2 上循环,循环变量也必须是元胞数组。为一致性欢呼,但我认为大多数用户会更频繁地解决它而不是按预期使用它。 我会选择for ii = 1:numel(someCellArray); % do something with someCellArrayii; end,在时间和内存方面应该更高效。 【参考方案1】:

我认为在一般情况下没有办法避免这个问题。但是,如果您的单元格数组包含所有数字或所有字符,则有一种方法。您可以转换为数组并让for 循环对其进行迭代。

例如,这个:

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

给予:

s =
     1
s =
     2
s =
     3

另一种选择是创建一个对数组的每个单元格进行操作的函数。然后你可以简单地调用cellfun 而根本没有循环。

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

【讨论】:

some_cell_array 的内容是字符串时,这似乎不起作用。 @H.Muster 我没有声称它适用于字符串,只适用于字符。类似'a','b','c' @shoelzer:不,你没有,我不想为此责备你,也就是说,无意冒犯。我只是想说明一个事实。 @H.Muster 未采取任何措施!它不适用于字符串的原因是所有字符串都将连接成一个字符串,并且循环将单独遍历每个字符。例如,['a', 'bb', 'c'] 给出'abbc'【参考方案2】:

只是 Sam Robert 对原始问题的评论的一个小补充,关于为什么你应该更喜欢 s: 而不是 s1:更容易跟踪错误。

假设您错误地将单元格 s 存储为 而不是 。那么

for s = some_cell_array

将简单地返回一个单元格s,它等于some_cell_array。然后语法s1 将返回some_cell_array 的第一个元素,而s: 将生成some_cell_array 中所有元素的列表。第二种情况肯定会导致以下代码中的执行错误。而第一种情况有时会产生难以检测的错误。

【讨论】:

以上是关于可以避免迭代单元格数组时的“s1 烦恼”吗?的主要内容,如果未能解决你的问题,请参考以下文章

单元格删除时的 UICollectionView 动画

Excel想实现在一个单元格内输入数字,另一个单元格累加?

在matlab中连接单元格数组的向量

在列中找到下一个空单元格时避免合并单元格

周赛162:奇数值单元格的数目

将单元格数据复制到宏中以避免更新宏