Как я могу сгруппировать переменные из файла mat по имени и собрать их в структуру?
Я читаю в файле Mat, который имеет переменные со счетчиком, например a1
, a2
, a3
, b
, c1
а также c2
,
Я хочу поместить данные в структуру с именами полей "a", "b" и "c", где a=[a1;a2;a3]
, b=b
а также c = [c1; c2]
,
Алгоритм должен быть в состоянии сделать это, не зная, каково максимальное значение счетчика каждой переменной. Как я могу это сделать?
1 ответ
Во-первых, вы должны загрузить данные из файла mat, используя load
функция, поместив его в структуру. Допустим, что дали вам следующие примерные данные:
>> s = struct('a1',1:5,'b',[],'a2',1:5,'a3',1:5,'c1',1:3,'c2',3:5)
s =
a1: [1 2 3 4 5]
b: []
a2: [1 2 3 4 5]
a3: [1 2 3 4 5]
c1: [1 2 3]
c2: [3 4 5]
Затем мы упорядочим поля в алфавитном порядке, используя orderfields
найти имена полей, используя fieldnames
использовать regexprep
убрать все конечные числа из имен полей, а затем получить уникальные подстроки, используя unique
:
>> s = orderfields(s);
>> [strs, inds] = unique(regexprep(fieldnames(s), '\d*$', ''), 'last')
strs =
'a'
'b'
'c'
inds =
3
4
6
Используя индексы, возвращенные unique
, мы можем вычислить, сколько раз каждая подстрока появляется, выполнив diff([0; inds])
, Затем мы группируем данные структуры в массив ячеек, используя эти значения и struct2cell
а также mat2cell
:
>> data = mat2cell(struct2cell(s), diff([0; inds]))
data =
{3x1 cell}
{1x1 cell}
{2x1 cell}
Обратите внимание, что у нас есть массив ячеек. Если вы точно знаете, что каждый набор записей для каждой подстроки будет соединен правильно (как в нашем примере), вы можете объединить их, используя cellfun
а также cell2mat
следующее:
>> data = cellfun(@cell2mat, data, 'UniformOutput', false)
data =
[3x5 double]
[]
[2x3 double]
Теперь у нас есть матричный массив ячеек, и новую структуру можно создать, используя cell2struct
:
>> snew = cell2struct(data, strs)
snew =
a: [3x5 double]
b: []
c: [2x3 double]