Как я могу сгруппировать переменные из файла 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]
Другие вопросы по тегам