2
votes

I've got a nested struct array like

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

Now I want to change the values of var1 to using the elements of the vector x = [3; 4] for each of the respective values.

The result should be

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

I have tried

% 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(:);

Curiously, if x is a cell array, the second syntax works

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

Luckily, it's not too complicated to convert my numeric vector to a cell array using mat2cell, but is that the only way to do this assignment without a for loop?

What's the correct syntax for multiple assignment to a nested struct array? Can I use numeric vectors or do I have to use cell arrays?

1
Do you want each element var1 to be equal to [3;4] or do you want to assign 3 to the first one, and 4 to the second one?Cris Luengo
3 to the first and 4 to the second.Cecilia

1 Answers

4
votes

The statement

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

is shorthand for

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

(see the documentation for deal).

Thus you can also write

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

I'm not aware of any other way to assign different values to a field in a struct array in a single command.

If your values are in a numeric array, you can easily convert it to a cell array using num2cell (which is simpler than the mat2cell you found).

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

In general, struct arrays are rather awkward to use for cases like this. If you can, I would recommend that you store your data in normal numeric arrays, which make it easier to manipulate many elements at the same time. If you insist on using a struct array (which is convenient for certain situations), simply use a for loop:

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

The other alternative is to use table.