我想结合两个具有不同字段名称的结构.
例如,从以下开始:
A.field1 = 1; A.field2 = 'a'; B.field3 = 2; B.field4 = 'b';
我想拥有:
C.field1 = 1; C.field2 = 'a'; C.field3 = 2; C.field4 = 'b';
有没有比使用"fieldnames"和for循环更有效的方法?
编辑:我们假设在字段名称冲突的情况下,我们优先考虑A
.
没有碰撞,你可以做到
M = [fieldnames(A)' fieldnames(B)'; struct2cell(A)' struct2cell(B)']; C=struct(M{:});
而且效率相当高.但是,struct
重复字段名称出错,并使用unique
杀死性能预先检查它们,以确保循环更好.但这就是它的样子:
M = [fieldnames(A)' fieldnames(B)'; struct2cell(A)' struct2cell(B)']; [tmp, rows] = unique(M(1,:), 'last'); M=M(:, rows); C=struct(M{:});
您可以通过假设没有冲突并在调用周围使用try/catch struct
来优雅地降级到冲突处理案例来创建混合解决方案.
简答:( setstructfields
如果您有信号处理工具箱).
官方解决方案由Loren Shure在她的MathWorks博客上发布,并由SCFrench在这里和Eitan T对不同问题的回答进行了演示.但是,如果你有信号处理工具箱,一个简单的未记录的函数已经这样做了 - setstructfields
.
help setstructfields
setstructfields Set fields of a structure using another structure
setstructfields(STRUCTIN, NEWFIELDS) Set fields of STRUCTIN using
another structure NEWFIELDS fields. If fields exist in STRUCTIN
but not in NEWFIELDS, they will not be changed.
在内部它使用fieldnames
和for
循环,因此它是一个便利函数,具有错误检查和自身结构的字段的递归.
例
"原始"结构:
% struct with fields 'color' and 'count' s = struct('color','orange','count',2) s = color: 'orange' count: 2
包含新值的第二个结构'count'
,以及一个新字段'shape'
:
% struct with fields 'count' and 'shape' s2 = struct('count',4,'shape','round') s2 = count: 4 shape: 'round'
致电setstructfields
:
>> s = setstructfields(s,s2) s = color: 'orange' count: 4 shape: 'round'
该字段'count'
已更新.该字段'shape'
已添加.该领域'color'
保持不变.
注意:由于该功能未记录,因此可能随时更改或删除.
我在File Exchange上找到了一个很好的解决方案:catstruct.
如果不测试性能,我可以说它完全符合我的要求.它当然可以处理重复的字段.
下面是它的工作原理:
a.f1 = 1; a.f2 = 2; b.f2 = 3; b.f4 = 4; s = catstruct(a,b)
会给
s = f1: 1 f2: 3 f3: 4