如何将一个结构体数组传递给另一个结构体数组?

5

我试图传递一个结构体数组,但是没有成功。

s(1).f = (1:3);
s(2).f = (4:6);
s(3).f = (7:9);

q(1).n = 'nameA';
q(2).n = 'nameB';
q(3).n = 'nameC';
q(3).f = [];

q.f = s.f

不应修改字段n

我有遗漏什么吗?

4个回答

2

那么关于 arrayfun 呢?

q = arrayfun( @(x,y) setfield( x, 'f', y.f ), q, s );

显然,setfield只能用于设置结构体数组中的一个元素,因此需要使用arrayfun编辑: Dan提供了一个更好的答案。

你能否在不知道“f”这个名称和类似“f”的多个字段的情况下应用它?因此,将从“s”到“q”的所有字段添加进去? - Leo
1
@Leo,你可以使用 Dan 的回答 中的方法,只需使用 fieldnames 循环所有字段即可。 - Shai

2
您可以直接将结构体数组的每个字段分配给单元格数组,然后可以使用deal将结构体转换为单元格数组:
s(1).f = (1:3);
s(2).f = (4:6);
s(3).f = (7:9);

q(1).n = 'nameA';
q(2).n = 'nameB';
q(3).n = 'nameC';

c = cell(3,1);
[c{:}] = deal(s.f);
[q.f] = c{:};

这里有一篇关于这种事情的好文章

编辑: 或者正如Shai所指出的,你可以直接去

[q.f] = s.f

6
顺便问一下,为什么不直接写 [q.f] = s.f - Shai
1
@Massoud,'[q.f]=s.f;' '[q.fNew]=s.fNew;'有什么问题吗?如果这是一个新问题,请单独发布。 - Shai
@Shai,我只是好奇如何解决这个问题,当我有更多的字段时。 - Massoud
1
谢谢,是的,我现在同意了!对于s.f也是如此,它也提供逗号分隔列表(CSL)。在左手边的[]与右手边的CSL相结合,是自Matlab 7版本以来deal()命令的替换语法。 - Massoud
1
值得注意的是,[q.f] = s.f 表示法仅在 q 预先分配到正确的大小时才有效。如果 q 尚未定义,则此方法只会将 q 定义为 s(1).f - sco1
显示剩余6条评论

1

虽然我认为@Dan的回答对于这个问题非常权威,但我想提出一个替代方案:

s(1).f = (1:3);
s(2).f = (4:6);
s(3).f = (7:9);

[q(1:length(s)).f] = s.f;

尽管比[q.f] = s.f语法稍微冗长,但它具有优点,即使q未预先分配到正确的大小以复制s,它也能按预期运行。
例如:
s(1).f = (1:3);
s(2).f = (4:6);
s(3).f = (7:9);

[q.f] = s.f;

返回 q.f 作为一个等于 s(1).f1x1结构体

1
我希望你能更加突出Shai的建议,因为这样更易于阅读。 [q.f] = s.f

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