如何动态地将多个字段动态添加到Matlab结构中?

时间:2015-03-13 20:40:19

标签: matlab

我想将结构中的多个字段设置为单个值。这些领域可能是新的。字段名称可能是动态定义的。字段名称的数量是动态定义的。有没有好办法呢?

例如,如果字段名称的数量是固定的,则以下情况有效。但这很乏味而且很愚蠢。如果允许更改字段名称的数量,它将不起作用。

S=struct;
[S.f1,S.f2,S.f3]=deal(input);

3 个答案:

答案 0 :(得分:2)

我现在能想到的最简单的事情是:

function [myStruct] = InitStruct(myStruct, initValue)
%[
    % Default arguments for demo purpose
    if (nargin < 2), initValue = 42; end
    if (nargin < 1), myStruct = struct('f1', '', 'f2', '', 'f3', ''); end

    % Obtain all current fields in the structure
    fnames = fieldnames(myStruct); 

    % Dynamically set all fields with initValue
    for fi = 1:length(fnames),
        myStruct.(fnames{fi}) = initValue; 
    end
%]
end

注意:它只适用于结构是标量的...包含所有情况,你可以在结构的长度上添加一个循环:

function [myStruct] = InitStruct(myStruct, initValue)
%[
    if (nargin < 2), initValue = 42; end
    if (nargin < 1), 
        myStruct = struct('f1', '', 'f2', '', 'f3', '');
        myStruct = repmat(myStruct, [2 6]); % Making structure not scalar
    end

    fnames = fieldnames(myStruct);
    for fi = 1:length(fnames),
        for linearIndex = 1:length(myStruct),
            myStruct(linearIndex).(fnames{fi}) = initValue;
        end
    end
%]
end

答案 1 :(得分:2)

对于字母对(例如f1f2等),我建议使用struct-arrays进行初始化。您可以通过将单元格数组传递给您想要的值的struct函数来创建它们:

ini = 1;
n   = 5;
s = struct('f',repmat({ini},n,1));

然后s是一个初始值为ini的结构数组。您可以访问s(1).f .... s(n).f等元素。 您还可以将deal函数与struct array literal一起使用,我觉得它更干净,就像这样;

ini = 1;
n   = 5;
s(n).f = [];
[s.f] = deal(ini);

对于更通用的字段名,@ CitizenInsane使用动态字段引用的答案是我所知道的唯一方法。

如果MATLAB使用单元格字符串参数从动态字段创建逗号分隔列表,这可能会改变,但这只是我的梦想。

答案 2 :(得分:0)

这个怎么样?

S = struct('f1', 1, 'f2', 2);
old_fields = fieldnames(S);
old_values = struct2cell(S);

new_fields = {'f2'; 'f3'; 'f4'}; % 1 replacement, 2 new fields
n_new_fields = numel(new_fields);
value = 0;

all_fields = [old_fields ; new_fields];
all_values = [old_values ; repmat({value}, n_new_fields, 1)];
S = cell2struct(all_values, all_fields);

我不确定Matlab是否因为两次相同的字段而无法返回错误(现在无法进行测试)。如果是这样,您需要使用

[all_fields, idx] = unique(all_fields);
all_values = all_values(idx);

在调用cell2struct之前(因为Matlab在最近的版本中改变了unique的行为,所以要小心)。