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

Изменить: извинения, забыл спринтф.

Другие вопросы по тегам