Matlab: динамическое имя для структуры
Я хочу создать структуру с именем переменной в сценарии Matlab. Идея состоит в том, чтобы извлечь часть входной строки, заполненной пользователем, и создать структуру с этим именем. Например:
CompleteCaseName = input('s');
USER WRITES '2013-06-12_test001_blabla';
CompleteCaseName = '2013-06-12_test001_blabla'
casename(12:18) = struct('x','y','z');
В этом примере casename(12:18) дает мне результат test001.
Я хотел бы сделать это, чтобы позволить мне легко сравнивать два случая, последовательно импортируя результаты каждого случая. Так что я мог бы написать, например:
plot(test001.x,test001.y,test002.x,test002.y);
Проблема в том, что строка casename(12:18) = struct('x','y','z'); недопустимо для Matlab, потому что это заставляет меня изменить строку на структуру. Все примеры, которые я нахожу со структурой, основаны на определении как
S = struct('x','y','z');
И я не могу найти способ сделать динамическое имя для S на основе строки.
Я надеюсь, что кто-то понял, что я пишу:) Я проверил в FAQ и с Google, но я не смог найти ту же проблему.
3 ответа
Используйте структуру с динамическим именем поля.
Например,
mydata.(casename(12:18)) = struct;
даст вам структуру mydata
с полем test001
,
Вы можете позже добавить свой x
, y
, z
поля к этому.
Вы можете использовать поля позже либо mydata.test001.x
или mydata.(casename(12:18)).x
,
Если это вообще возможно, старайтесь держаться подальше от использования eval
, как предполагает другой ответ. Это очень затрудняет отладку, и приведенный там пример, который напрямую eval
Пользовательский ввод:
eval('%s = struct(''x'',''y'',''z'');',casename(12:18));
это даже угроза безопасности - что произойдет, если пользователь введет строку, в которой выбранные символы system(''rm -r /''); a
? Что-то плохое, вот что.
Как я уже говорил, лучший сценарий - это когда все ваши x
а также y
векторы имеют одинаковую длину. В этом случае вы можете сохранить все данные из разных файлов в 2 матрицы и вызвать plot(x,y)
построить каждый столбец как серию.
В качестве альтернативы вы можете использовать массив ячеек, такой что:
c = cell(2,nufiles);
for ii = 1:numfiles
c{1,ii} = import x data from file ii
c{2,ii} = import y data from file ii
end
plot(c{:})
Структура, с другой стороны
s.('test001').x = ...
s.('test001').y = ...
Используйте eval:
eval(sprintf('%s = struct(''x'',''y'',''z'');',casename(12:18)));
Изменить: извинения, забыл спринтф.