如何在Matlab中复制结构域(非标量结构)?

Dim*_*ims 3 arrays matlab

假设我有非标量结构

res = struct(); res(1).name = 'hello'; res(2).name = 'world';
Run Code Online (Sandbox Code Playgroud)

现在我想将整个name字段内容复制到另一个字段,比如说tag.

以下两种方法均无效:

>> res.tag = res.name;
Scalar structure required for this assignment.

>> [res.tag] = [res.name];
Insufficient number of outputs from right hand side of equal sign to satisfy assignment.

>> {res.tag} = {res.name};
 {res.tag} = {res.name};
           ?
Error: The expression to the left of the equals sign is not a valid target for an assignment.
Run Code Online (Sandbox Code Playgroud)

还有其他想法吗?

Lui*_*ndo 6

使用

[res(:).tag] = res(:).name;
Run Code Online (Sandbox Code Playgroud)

或者更简单地说,就像你发现自己一样:

[res.tag] = res.name;
Run Code Online (Sandbox Code Playgroud)

与左手侧方括号中的语法是类似于用于捕获由函数返回几个输出:[out1, out2] = fun(...); 请参阅MATLAB特殊字符.

实际上,语法res.tag产生一个以逗号分隔的列表 ; 并且[...]是为一个这样的列表中的每个元素分配值的标准; 请参阅从逗号分隔列表中分配输出.

赋值的右侧应该是另一个以逗号分隔的列表.如果它是单个元素,或者您想手动指定列表,则需要deal:

values = {10, 20};
[res.test] = values{:}; % works. {:} produces a comma-separated list
[res.test] = 10,20; % doesn't work. Use `deal`
[res.test] = deal(10,20); % works
[res.test] = 10; % doesn't work, unless `res` is scalar. Use `deal`
[res.test] = deal(10); % also works. 10 is repeated as needed
Run Code Online (Sandbox Code Playgroud)

你的尝试[res.tag] = [res.name];不起作用的原因是[res.name]在右侧将逗号分隔列表的结果连接res.name一个数组,因此它与[res.test] = 10;上面的情况相同.