Matlab 结构体之间相同字段的赋值

假设有两个结构体 main_subjectall_subject 。其中 main_subject 中包含了某位同学的主修成绩和学号姓名信息,需要将这些信息地填到包含所有科目信息的另一个结构体 all_subject 对应的字段中(不存在的字段保持默认值),如何比较便利地实现呢?

all_subject = 

  包含以下字段的 struct:

       Name: ''
         ID: 0
    Chinese: 0
       Math: 0
    English: 0
    Physics: 0
    History: 0

main_subject = 

  包含以下字段的 struct:

       Name: 'Jake'
         ID: 101
    Chinese: 102
       Math: 150
    English: 122

具体的实现如下:

main_subject = struct('Name', 'Jake',...
                      'ID', 101, ...
                      'Chinese', 102,...
                      'Math', 150,...
                      'English', 122)

all_subject = struct('Name', '', ...
                     'ID', 0, ...
                     'Chinese', 0, ...
                     'Math', 0, ...
                     'English', 0, ...
                     'Physics', 0, ...
                     'History', 0)

cmb = structAssign(all_subject, main_subject)

function [structA] = structAssign(structA, structB)
% 将 structB 中与 structA 相同字段的成员的值赋值给 structA 对应的成员

    keys = fieldnames(structB); % 获得结构体B的所有字段
    for i = 1:length(keys)
        cur_key = keys{i};
        if isfield(structA, cur_key)
            % 2017年后支持: structName.(dynamicExpression)
            % dynamicExpression 是一个变量或表达式,返回字符串标量(结构体字段)
            % 类似于 getfield() 和 setfield() 功能
            structA.(cur_key) = structB.(cur_key);
        else
            warming('字段"%s"不存在!', cur_key);
        end
    end

end

说明:

  1. 不能直接赋值 all_subject = main_subject。直接赋值的结果是 all_subject 完全复制 main_subject,丢失了原来的部分字段。

  2. 关于 Matlab 结构体常用的几个操作函数:

  3. Generate Field Names from Variables Matlab2017版本之后,结构体可以基于变量的字段访问方式,常见的字段访问有

    % 方式1
    main_subject.Chinese = 123;
    chinese = main_subject.Chinese;
    % 方式2
    main_subject.('Chinese') = 123;
    chinese = main_subject.('Chinese');
    % 方式3
    main_subject = setfield(main_subject, 'Chinese', 123);
    chinese = getfield(main_subject, 'Chinese');
    
原文地址:https://www.cnblogs.com/wreng/p/15342998.html