Имена полей динамической структуры в Matlab - совет новичку?

У меня есть> 10 текстовых файлов, которые я прочитал в переменной «файлы», используя dir (* .txt). Файлы состоят из матриц различных размеров порядка 100x1000. Имена файлов для каждого из них имеют одинаковый формат (L\d{1,2}N_20\d{2}.txt), поэтому с блестящей помощью эфемерного пользователя я смог реализовать довольно хорошую процедуру для динамического генерировать имена полей во вложенной структуре из частей имен файлов. Это проделано миллион миль в правильном направлении, чтобы помочь мне в достижении моей конечной цели, но остается одна загадка: в последнем блоке кода моего героя он предложил мне написать:

for ix_id = 1:length(ids)
  for ix_year=1:length(ids_years{ix_id})
    data.(ids{ix_id}).(['Y' ids_years{ix_id}{ix_year}]) = ...
                         'read in my data here for each one';
  end
end

К сожалению, вчера я буквально впервые попытался использовать регулярное выражение и структуры. Этот код создает количество полей структуры, равное количеству моих файлов, которые я хотел бы загрузить, и исследование показывает, что

names=fieldnames(data)

дает

names =
    {
       [1,1] = L14N
       [2,1] = L6N
    }

и

names2=fieldnames(data.L14N)

дает

names2 =
{
   [1,1] = Y2009103
   [2,1] = Y2010087
}

именно это я и хотел, но я просто не понимаю, как «прочитать мои данные здесь ...». Я хотел бы поместить файл с L14N и 2009103 в его имени в той части структуры, которая определена как data.L14N.Y2009103 и так далее. Поскольку кажется, что мои данные считываются в правильном порядке, я попытался добавить внешний цикл:

for jx = 1:numel(files)
  for ix_id=1:length(ids)
    for ix_year=1:length(ids_years{ix_id})
      data.(ids{ix_id}).(['Y' ids_years{ix_id}{ix_year}]) = dlmread(files{jx})
    end
  end
end

но, конечно, это привело к тому, что все поля структуры содержали только матрицу, найденную в файлах{numel(files)} (т.е. последняя итерация моего цикла).

Рискуя задать плохой вопрос, может ли кто-нибудь помочь мне понять, как я должен читать данные? Это все тщательно продуманная уловка, чтобы избежать eval, но я начинаю задаваться вопросом, сумасшедший ли я, чтобы попробовать это.


person k.mat27    schedule 06.03.2014    source источник


Ответы (1)


Вы уже получили название, но разделили его на несколько частей.

ids{ix_id} это например L6N

['Y' ids_years{ix_id}{ix_year}] это например Y2010087

Чтобы вернуть имя файла, соедините эти части вместе:

[ids{ix_id} '_' ids_years{ix_id}{ix_year} '_2000MHZ.txt']

person Daniel    schedule 06.03.2014
comment
Ух ты...! Это, конечно, именно то, что я ищу. Не могу поверить, что это не пришло мне в голову. - person k.mat27; 07.03.2014