如何在Matlab中复制非标量结构的结构字段?

3
假设我有一个非标量结构。
res = struct(); res(1).name = 'hello'; res(2).name = 'world';

现在我想要将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.

有其他想法吗?
1个回答

6

使用

[res(:).tag] = res(:).name;

更简单地说,正如您自己所发现的:
[res.tag] = res.name;

左侧方括号语法与函数返回多个输出的语法类似:[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

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

太好了,这怎么解释呢?以下代码也可以正常工作 [res.tag] = res.name;。我们在左边有一个数组,在右边有一个序列。 - Dims
1
这是MATLAB在引入deal函数后不久开发的简化语法。以前是[res.tag] = deal(res.name),后来他们意识到如果可以省略deal调用并直接执行赋值操作,则不会存在歧义。 - Cris Luengo
@Dims 我已经在解释上进行了扩展。 - Luis Mendo
1
@Cris 谢谢你提醒我。我已经加入了有关 deal 的一点内容。 - Luis Mendo
1
我想知道为什么[res.test] = 10,20不起作用,我最近回答另一个问题时也注意到了这一点。我认为这是因为逗号分隔语句,所以它是[res.test] = 10作为一个语句,而20则是另一个语句。好的回答! - Cris Luengo
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接