可以避免迭代单元格数组时的“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 烦恼”吗?的主要内容,如果未能解决你的问题,请参考以下文章