【问题标题】:Do I always need to use a cell array to assign multiple values to a struct array?我是否总是需要使用元胞数组为结构数组分配多个值?
【发布时间】:2018-05-17 21:26:53
【问题描述】:

我有一个类似的嵌套结构数组

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 循环的情况下执行此分配的唯一方法吗?

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

【问题讨论】:

  • 您希望每个元素 var1 等于 [3;4] 还是要将 3 分配给第一个,将 4 分配给第二个?
  • 3 到第一个,4 到第二个。

标签: matlab


【解决方案1】:

声明

[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{:};

一般来说,结构数组在这种情况下使用起来相当尴尬。如果可以,我建议您将数据存储在普通数值数组中,这样可以更轻松地同时操作多个元素。如果你坚持使用结构数组(这在某些情况下很方便),只需使用 for 循环:

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

另一种选择是使用table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-09
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多