以某種方式遞歸地連接兩個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
以某種方式遞歸地連接兩個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
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)
。
該解決方案不符合「沒有迭代其中一個結構的所有葉」的要求 – zhanwu 2011-06-08 00:55:09
@zhanwu:Fair足夠。我同意在上面的工作中有迭代和遞歸。它不會遍歷* all *葉子,只有'y'的葉子在'x'和'y'都是結構的級別上。 – Ramashalanka 2011-06-08 01:42:54
爲了這個工作你需要一個衝突的決定標準。例如應該res.a = 1或res.a = 4? – Azim 2011-06-07 19:28:04
默認情況下,第二個結構中的值將覆蓋具有相同字段名的第一個結構中的值。 – 2011-06-07 19:32:13