如何合并结构中的冗余字段?

时间:2018-10-15 14:06:34

标签: matlab matlab-struct

我有一个包含多个字段的数据集,其中几个字段是等效属性的不同名称。我已经重新缩放并调整了数据,以便数量可比,并希望将它们合并到一个字段中。

作为一个玩具示例,假设我有:

s = struct('pounds', [nan nan 4.8], 'pennies', [120 370 nan]);
s.pennies = s.pennies/100;

如何合并不完整的字段以获得所需的输出:

snew = struct(pounds, [1.2 3.7 4.8]);

3 个答案:

答案 0 :(得分:2)

如果您修改了字段值以使它们相等,并且只需要合并非NaN值,则一种选择是vertically concatenate个字段,然后使用min或在各列的下方max(将忽略NaN的值)。然后只需使用rmfield删除不需要的字段:

>> s = struct('pounds', [nan,nan,4.8], 'pennies', [120,370,nan]);
>> s.pounds = min([s.pounds; s.pennies./100], [], 1);  % Scaling included here
>> s = rmfield(s, 'pennies')

s = 

  struct with fields:

    pounds: [1.2000 3.7000 4.8000]

答案 1 :(得分:1)

以下内容适用于任意数量的字段。由于可以保证在每个位置上都没有NaN一个字段,因此您可以

  1. 转换为矩阵,以便每个原始字段成为矩阵的一行。
  2. 仅保留数字,而忽略NaN。通过假设,这将为每列恰好给出一个数字。
  3. 将其安排到具有所需字段名称的结构中。

s = struct('pounds',[nan,nan,4.8], 'pennies', [120,370,nan])
s.pennies = s.pennies/100; % example data
target_field = 'pounds'; % field to which the conversion has been done

t = struct2cell(s); % convert struct to cell array
t = vertcat(t{:}); % convert cell array to matrix
t = t(~isnan(t)).'; % keep only numbers, ignoring NaN's
result = struct(target_field, t); % arrange into a struct

答案 2 :(得分:0)

在下面试试我的两层纸

c=struct2cell(s);
s=struct('pounds',unique([c{:}]));

甚至更好,您也可以使用以下oneliner

s=struct('pounds',unique(cell2mat(cellfun(@(x) x(:), struct2cell(s),'UniformOutput',false)))')