为什么在单元数组上的for循环将循环变量包装在单元数组中?

时间:2017-08-16 12:36:18

标签: matlab for-loop cell-array

采取以下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{1}之前,我很难想象你不想做q的情景。或者我在设置循环时做错了什么?

1 个答案:

答案 0 :(得分:1)

声明

for index = valArray

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

  

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

至于为什么它的行为如此,我看到两个原因。首先,要保持for循环的语义:它始终应用()索引。

其次,考虑ValArray是2D单元阵列的情况,例如

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

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