连接结构:更新结构字段而不覆盖现有字段
Concatenate structs: Update struct fields without overwriting existing fields
我想知道从具有不同字段的另一个结构更新 Matlab 结构的最简单方法。请看我的例子来理解我的意思。我有两个结构 S1 和 S2,它们具有不同的字段名,我想合并它们。
S1.a = 1;
S1.b = 2;
S2.c = 3;
S2.d = 4;
如果我写S1 = S2;
S1 结构显然会被S2 覆盖。我希望结果如下代码:
S1.a = 1;
S1.b = 2;
S1.c = 3;
S1.d = 4;
有没有简单的方法。我设法通过使用 for 循环和 fieldnames()
函数来做到这一点,以便从 S2 获取字段名并将其放入 S1,但这并不是一个很好的解决方案。
我怀疑是否存在真正的矢量化方式。如果您真的需要最后一点速度,请不要使用结构。
这是循环解决方案:
fn = fieldnames(S2)
for ii = 1:numel(fn), S1.(fn{ii}) = S2.(fn{ii}); end
之所以没有平凡的解决方案,是因为 Matlab 无法提前知道 S1
中没有字段 c
或 d
,如果有,会有冲突。
似乎是向量化的,虽然我不知道这些函数在内部是如何工作的。而且它们可能并不比简单循环快多少。
如果您知道这两个结构没有相同的字段,这可能会有所帮助
tmp = [fieldnames(S1), struct2cell(S1); fieldnames(S2), struct2cell(S2)].';
S1 = struct(tmp{:});
我想知道从具有不同字段的另一个结构更新 Matlab 结构的最简单方法。请看我的例子来理解我的意思。我有两个结构 S1 和 S2,它们具有不同的字段名,我想合并它们。
S1.a = 1;
S1.b = 2;
S2.c = 3;
S2.d = 4;
如果我写S1 = S2;
S1 结构显然会被S2 覆盖。我希望结果如下代码:
S1.a = 1;
S1.b = 2;
S1.c = 3;
S1.d = 4;
有没有简单的方法。我设法通过使用 for 循环和 fieldnames()
函数来做到这一点,以便从 S2 获取字段名并将其放入 S1,但这并不是一个很好的解决方案。
我怀疑是否存在真正的矢量化方式。如果您真的需要最后一点速度,请不要使用结构。
这是循环解决方案:
fn = fieldnames(S2)
for ii = 1:numel(fn), S1.(fn{ii}) = S2.(fn{ii}); end
之所以没有平凡的解决方案,是因为 Matlab 无法提前知道 S1
中没有字段 c
或 d
,如果有,会有冲突。
如果您知道这两个结构没有相同的字段,这可能会有所帮助
tmp = [fieldnames(S1), struct2cell(S1); fieldnames(S2), struct2cell(S2)].';
S1 = struct(tmp{:});