动态填充空单元格

时间:2016-05-31 10:52:54

标签: arrays matlab

假设我们有一个结构v,其对象中有可变数量的元素

>> v(1).a = 1:10;
>> v(2).a = 1:20;
>> v(3).a = 1:30;

现在,如果我们想将它放入一个单元格数组中,我们可以简单地连接,我们将有一个带有3个单元格的a

>> c = {v(1).a,v(2).a,v(3).a}

c = 

    [1x10 double]    [1x20 double]    [1x30 double]

我们可以使用

访问单元格内的任何元素
c{i}(j)

但现在例如,如果我必须在for循环中动态填充相同的数组

c = v(1).a
for i= 2:numel(v)
    c= {c ,v(i).a};
end

对于前2次迭代,它的工作方式与c = {v(1).a,v(2).a}

相同
c = 

[1x10 double]    [1x20 double]

但在第3次迭代后,它将前两个数组转换为带有单元格的单元格

c = 

{1x2 cell}    [1x30 double]

怎么能避免这个?而是像第一种情况一样,使用for循环

创建一个数组的单元格

2 个答案:

答案 0 :(得分:3)

尝试创建c作为单元格数组,然后将单元格数组附加到其中:

c = {v(1).a}
for i = 2:numel(v)
    c = [c, {v(i).a}];
end

或更简单的初始化:

c = {};
for i = 1:numel(v)
    c = [c , {v(i).a}];
end

但是,您可以使用单行代码更简单地执行此操作:

c = { v.a }

最后一个解决方案是MATLAB“逗号分隔列表”,是构建数组和单元数组的便捷方法。 如果您在命令行中键入v.a,则会看到返回三个答案(即v(1).av(2).av(3).a)。通过写{ v.a },它相当于写出这三个答案,用逗号分隔,即相当于{v(1).a, v(2).a, v(3).a}

答案 1 :(得分:1)

我会推荐这种方法:

c = {};
for i = 1:numel(v)
    c{end+1} = v(i).a;
end

c = {};
for i = 1:numel(v)
    c(end+1) = {v(i).a};
end

我怀疑(based on this answer)将比Justin提出的连接方法更快。