我想如果我写
for x = cell_array
...
end
然后循环将遍历cell_array
的元素,但在以下情况下它不会:
>> tags
tags =
'dset3'
'dset4'
'cpl1'
>> class(tags)
ans =
cell
>> for t = tags
tmp = t{:} %No semicolon: i.e. print it.
end
tmp =
dset3
所以它只适用于第一个元素。
有什么问题?
答案 0 :(得分:9)
根据the documentation,for x = cell_array
会迭代单元格数组的列。
问题混淆的原因与{:}
展开的行为有关:
>> a = {3;4}
a =
[3]
[4]
>> b = a{:}
b =
3
在上文中,a{:}
执行的操作类似于以逗号分隔的列表键入,其中元素是单元格数组a
的元素。除了不完全!如果我们明确地编写这样的列表,我们得到:
>> c = 3,4
c =
3
ans =
4
不知何故,对于>> b = a{:}
,a
的其他元素会被静默丢弃,即使例如a = {1 2; 3 4}
。
但是,在其他情况下,a{:}
将扩展为完整的逗号分隔列表:
>> extra_args = {'*-'; 'linewidth'; 30};
>> plot(1:2, extra_args{:})
>> extra_args = {};
>> plot(1:2, extra_args{:})
这将做他们打算做的事。
答案 1 :(得分:2)
Matlab内置了一个名为cellfun
的好函数。它允许您依次对阵列中的每个元素“做某事” - 无论其形状如何。
例如:
cellfun(@(x)fprintf(1,'%s',x), cellArray);
将遍历cellArray,并在每个单元格中打印字符串。
您还可以执行以下操作之一:
for x = cellArray(:)
% do stuff to x
end