【问题标题】:Why does a for loop over a cell array wrap the loop variable in a cell array?为什么单元格数组上的 for 循环将循环变量包装在单元格数组中?
【发布时间】:2018-01-24 14:33:00
【问题描述】:

采取以下MWE

for q = { {1,2}, {3,4} }
   disp(q{1})        % Displays 1x2 cell array
   disp(q{1}{1})     % Displays first element
end

这给出了输出

[1]    [2]
 1
[3]    [4]
 3

换句话说,q 变为 {{1,2}} 而不是 {1,2}。我会预料到后一种行为。

这种行为有什么理由吗?我很难想象在使用q 之前你不想做q=q{1} 的场景。还是我在设置循环时做错了什么?

【问题讨论】:

  • 有趣...文档中有关于迭代单元数组的任何内容吗?
  • 不是骗子。您询问基本原理,与其他问题不同,后者明确将其放在一边
  • @LuisMendo 你是对的!谢谢你的回答。

标签: matlab for-loop cell-array


【解决方案1】:

在声明中

for index = valArray

Matlab 应用 () 索引,即使 valArray 是一个元胞数组。正如documentation 所说,

在每次迭代时从数组valArray 的后续列创建列向量index。例如,在第一次迭代中,index = valArray(:,1)。循环最多执行n 次,其中nvalArray 的列数,由numel(valArray(1,:)) 给出。输入 valArray 可以是任何 MATLAB 数据类型,包括字符向量、元胞数组或结构。

至于 为什么 它的行为是这样的,我看到两个原因。首先,为了维护for 循环的语义:它始终应用() 索引。

其次,考虑ValArray是一个二维元胞数组比如

valArray = {1,     'aa',    [];
            'hey', {10 20}, 'bbb'};

for 循环中应用{} 索引与在每次迭代中选择 不兼容。例如,在第一次迭代中,您将获得 两个 值,即1hey。为了确保index 获得一个 值,它们需要保存在一个(列)单元数组{1; 'hey'} 中,这就是for 所做的。

【讨论】:

  • 对。只有当valArray 的大小为1xN 时,花括号索引才有意义。
猜你喜欢
  • 2014-03-02
  • 2017-09-17
  • 1970-01-01
  • 2017-07-14
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多