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?

### Answer1:

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`

.

人吐槽 | 人点赞 |

## Comment