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

4 回答 4

2

怎么样arrayfun

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

显然setfield仅用于在结构数组中设置一个结构元素 - 因此arrayfun.

编辑:Dan
给出了一个更好的答案。

于 2013-02-28T11:32:10.807 回答
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
于 2013-02-28T12:25:47.027 回答
1

我想让 Shai 的这个建议更明显,因为它更容易阅读。

[q.f] = s.f

于 2013-03-01T03:02:02.020 回答
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_1x1 structs(1).f

于 2015-12-28T18:37:06.440 回答