我是否总是需要使用单元格数组为结构数组分配多个值?

时间:2018-05-17 21:26:54

标签: matlab

我有一个像

这样的嵌套结构数组
A(1).B(1).var1 = 1;
A(1).B(2).var1 = 2;

现在,我想将var1的值更改为使用每个相应值的向量x = [3; 4]的元素。

结果应为

A(1).B(1).var1 = 3;
A(1).B(2).var1 = 4;

我试过了

% Error : Scalar structure required for this assignment.
A(1).B.var1 = x; 

% Error : Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
[A(1).B.var1] = x(:);

奇怪的是,如果x是一个单元格数组,那么第二种语法就可以了

x = {3, 4};
[A(1).B.var1] = x{:};

幸运的是,使用mat2cell将数字向量转换为单元格数并不太复杂,但是这是在没有for循环的情况下进行此分配的唯一方法吗?

对嵌套结构数组进行多次赋值的正确语法是什么?我可以使用数字向量还是必须使用单元格数组?

1 个答案:

答案 0 :(得分:4)

声明

[A(1).B.var1] = x{:};

的简写
[A(1).B.var1] = deal(x{:});

(参见documentation for deal)。

因此你也可以写

[A(1).B.var1] = deal(3,4);

我不知道在单个命令中为结构数组中的字段分配不同值的任何其他方法。

如果您的值位于数值数组中,则可以使用num2cell轻松将其转换为单元格数组(这比您找到的mat2cell更简单。)

data = [3,4];
tmp = num2cell(data);
[A(1).B.var1] = tmp{:};

通常,struct数组对于这样的情况使用起来相当尴尬。如果可以,我建议您将数据存储在普通的数字数组中,这样可以更容易地同时操作多个元素。如果你坚持使用struct数组(这对某些情况很方便),只需使用for循环:

data = [3,4];
for ii = 1:length(A(1).B)
   A(1).B(ii).var1 = data(ii);
end

另一种选择是使用table