Как я могу объединить избыточные поля в структуре? - PullRequest
0 голосов
/ 15 октября 2018

У меня есть набор данных с несколькими полями, некоторые из которых имеют разные имена для эквивалентных свойств.Я изменил масштаб и скорректировал данные так, чтобы величины были сопоставимыми, и хочу объединить их в одно поле.

В качестве примера, скажем, у меня есть:

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]);

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Если вы изменили значения полей так, что они должны быть эквивалентными, и вам просто нужно объединить значения, отличные от NaN, один из вариантов - вертикальная конкатенация полей и затем использование 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]
0 голосов
/ 15 октября 2018

Следующее работает для любого количества полей .Поскольку гарантируется, что только одно поле не является 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
...