Matlab 结构体的递归串联

发布于 2024-11-14 21:13:26 字数 258 浏览 0 评论 0原文

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

例如

xa=1;

xbc=2;

ybd=3;

你=4;

将导致以下结果

res = mergeStructs(x,y)

res.a=4

res.bc=2

res.bd=3

Is it somehow possible to concatenate two matlab structures recursively without iterating over all leaves of one of the structures.

For instance

x.a=1;

x.b.c=2;

y.b.d=3;

y.a = 4 ;

would result in the following

res = mergeStructs(x,y)

res.a=4

res.b.c=2

res.b.d=3

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

半城柳色半声笛 2024-11-21 21:13:26

以下函数适用于您的特定示例。有些事情它不会考虑,所以如果您希望它适用于其他情况,请告诉我,我可以更新。

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) && 添加到第一行。旧版本工作正常,因为如果 ~isstruct(x)isfield(x,n) 返回 0,但新版本如果y 是一个大结构体,~isstruct(x)

The following function works for your particular example. There will be things it doesn't consider, so let me know if there are other cases you want it to work for and I can update.

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

Then res = mergeStructs(x,y); gives:

>> res.a
ans =
     4

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

as you require.

EDIT: I added isstruct(x) && to the first line. The old version worked fine because isfield(x,n) returns 0 if ~isstruct(x), but the new version is slightly faster if y is a big struct and ~isstruct(x).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文