2011-06-07 40 views
4

以某種方式遞歸地連接兩個matlab結構而不迭代其中一個結構的所有葉子是可能的。Matlab結構的遞歸級聯

例如

x.a = 1;

x.b.c = 2;

y.b.d = 3;

y.a = 4;

會導致以下

解析度= mergeStructs(X,Y)

res.a = 4

res.bc = 2

res.bd = 3

+0

爲了這個工作你需要一個衝突的決定標準。例如應該res.a = 1或res.a = 4? – Azim 2011-06-07 19:28:04

+0

默認情況下,第二個結構中的值將覆蓋具有相同字段名的第一個結構中的值。 – 2011-06-07 19:32:13

回答

6

The followi ng函數適用於您的特定示例。會有一些它沒有考慮的事情,所以讓我知道是否有其他情況下,你想它的工作,我可以更新。

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)

+0

該解決方案不符合「沒有迭代其中一個結構的所有葉」的要求 – zhanwu 2011-06-08 00:55:09

+0

@zhanwu:Fair足夠。我同意在上面的工作中有迭代和遞歸。它不會遍歷* all *葉子,只有'y'的葉子在'x'和'y'都是結構的級別上。 – Ramashalanka 2011-06-08 01:42:54