MATLAB:如何使用字符串定义的名称创建结构字段。

MATLAB:如何使用字符串定义的名称创建结构字段。,matlab,structure,Matlab,Structure,我有一个这样的构造函数: function p = class_name(folder, file_name) xmlfile = fullfile(folder, file_name); xDoc = xmlread(xmlfile); struct = xml2struct(xDoc); %lots of repetitive code end if(isfield(struct.parameters, 'parameter_name

我有一个这样的构造函数:

function p = class_name(folder, file_name)

    xmlfile = fullfile(folder, file_name);
    xDoc = xmlread(xmlfile);

        struct = xml2struct(xDoc);

        %lots of repetitive code

end
if(isfield(struct.parameters, 'parameter_name'))
    p.property_name = struct.parameters.parameter_name.Text;
else
    p.property_name = '';
end
它读取XML文件并将其转换为结构。然后使用如下重复代码将结构元素分配给类的属性/字段:

function p = class_name(folder, file_name)

    xmlfile = fullfile(folder, file_name);
    xDoc = xmlread(xmlfile);

        struct = xml2struct(xDoc);

        %lots of repetitive code

end
if(isfield(struct.parameters, 'parameter_name'))
    p.property_name = struct.parameters.parameter_name.Text;
else
    p.property_name = '';
end
我想将其放入一个方法/函数中,给定struct元素的名称(此处为“parameter_name”)和类字段/属性的名称(此处为“property_name”)将前者分配给后者


是否可以为此编写通用函数/方法?谢谢。

您可以使用动态字段名实现此函数。这是针对此类情况的实施:

function p = setparam(s, p, param_name, prop_name)
    if(isfield(s.parameters, param_name))
       param = s.parameters.(param_name);
       p.(prop_name) = param.Text;
    else
       p.(prop_name) = '';
    end
end
也可以在旧版本的MATLAB上使用setfield和getfield:

function p = setparam(s, p, param_name, prop_name)
    if(isfield(s.parameters, param_name))
        param = getfield(s.parameters, param_name);
        p = setfield(p, prop_name, getfield(param, 'Text'));
    else
        p = setfield(p, prop_name, '');
    end
end

不要在代码中使用struct作为结构名称-它是一个保留关键字。

您可以使用动态字段名实现这样的函数。这是针对此类情况的实施:

function p = setparam(s, p, param_name, prop_name)
    if(isfield(s.parameters, param_name))
       param = s.parameters.(param_name);
       p.(prop_name) = param.Text;
    else
       p.(prop_name) = '';
    end
end
也可以在旧版本的MATLAB上使用setfield和getfield:

function p = setparam(s, p, param_name, prop_name)
    if(isfield(s.parameters, param_name))
        param = getfield(s.parameters, param_name);
        p = setfield(p, prop_name, getfield(param, 'Text'));
    else
        p = setfield(p, prop_name, '');
    end
end

不要在代码中使用struct作为结构名称-它是一个保留关键字。

使用动态字段名称:

yourStruct.parameters.('parameter_name')

使用动态字段名:

yourStruct.parameters.('parameter_name')

下面是一个通用函数: 可以用于结构或类对象

function obj_to = set_props(obj_to, obj_from)
% insert properties from obj_from into obj_to. 
props_from = fieldnames(obj_from);
props_to = fieldnames(obj_to);
for k = 1 : length(props_to)
    if ismember(props_to{k}, props_from)
        obj_to.(props_to{k}) = obj_from.(props_to{k});
    else
        obj_to.(props_to{k}) = '';
    end
end
现在,在构造函数中:

function obj = class_name(folder, file_name)
    xmlfile = fullfile(folder, file_name);
    xDoc = xmlread(xmlfile);
    s = xml2struct(xDoc); % do not use word "struct" for variables
    set_props(obj, s);    % if obj has handle, no need to return it from set_props()
end

下面是一个通用函数: 可以用于结构或类对象

function obj_to = set_props(obj_to, obj_from)
% insert properties from obj_from into obj_to. 
props_from = fieldnames(obj_from);
props_to = fieldnames(obj_to);
for k = 1 : length(props_to)
    if ismember(props_to{k}, props_from)
        obj_to.(props_to{k}) = obj_from.(props_to{k});
    else
        obj_to.(props_to{k}) = '';
    end
end
现在,在构造函数中:

function obj = class_name(folder, file_name)
    xmlfile = fullfile(folder, file_name);
    xDoc = xmlread(xmlfile);
    s = xml2struct(xDoc); % do not use word "struct" for variables
    set_props(obj, s);    % if obj has handle, no need to return it from set_props()
end

我得到一个警告。将动态字段名与结构一起使用,而不是getfield/setfield。我想这就是尼克的意思。你能修改一下你的代码吗?谢谢。@csetzkorn我已经更新了代码。您使用的是什么MATLAB版本?我没有收到任何警告。无论如何,为什么使用动态字段而不是getfield/setfield的解释是一些性能优势。当然,这在代码中是否重要取决于您是否需要检查。但是去掉警告绝对是使用动态字段的一个很好的理由。将动态字段名与结构一起使用,而不是getfield/setfield。我想这就是尼克的意思。你能修改一下你的代码吗?谢谢。@csetzkorn我已经更新了代码。您使用的是什么MATLAB版本?我没有收到任何警告。无论如何,为什么使用动态字段而不是getfield/setfield的解释是一些性能优势。当然,这在代码中是否重要取决于您是否需要检查。但是消除警告绝对是使用动态字段的一个很好的理由。