Matlab结构的递归连接

时间:2011-06-07 19:11:47

标签: matlab

以某种方式可以递归地连接两个matlab结构而不迭代其中一个结构的所有叶子。

例如

  

x.a = 1;

     

x.b.c = 2;

     

y.b.d = 3;

     

y.a = 4;

将导致以下

  

res = mergeStructs(x,y)

     

res.a = 4

     

res.b.c = 2

     

res.b.d = 3

1 个答案:

答案 0 :(得分:6)

以下功能适用于您的特定示例。会有一些它没有考虑的事情,所以如果有其他情况你想让它工作,请告诉我,我可以更新。

function res = mergeStructs(x,y)
if isstruct(x) && isstruct(y)
    res = x;
    names = fieldnames(y);
    for fnum = 1:numel(names)
        if isfield(x,names{fnum})
            res.(names{fnum}) = mergeStructs(x.(names{fnum}),y.(names{fnum}));
        else
            res.(names{fnum}) = y.(names{fnum});
        end
    end
else
    res = y;
end

然后res = mergeStructs(x,y);给出:

>> res.a
ans =
     4

>> res.b
ans = 
    c: 2
    d: 3

根据您的要求。

编辑:我在第一行添加了isstruct(x) &&。旧版本运行正常,因为如果isfield(x,n) 0返回~isstruct(x),但如果y是一个大结构~isstruct(x),新版本会稍快一些。