2015-02-27 2 views
0

Предположим, что переменная FileName содержит строку, такую ​​как Name1. Как создать переменную с именем Name1?Назовите переменную как строку в Matlab

Пример 4 на этой странице, похоже, похож, но я не могу заставить его работать. Правильно ли это? http://se.mathworks.com/help/matlab/ref/genvarname.html

+2

Вообще говоря: вы, вероятно, не хотите этого делать. – nkjt

+2

@nkjt: Я согласен, 'eval' - плохая практика. – Ratbert

ответ

1

За то, что вы хотите сделать, функция eval есть для вас:

FileName = 'Name1'; 
eval([FileName ' = 18;']);  % Executes "Name1 = 18;" 

и теперь переменная Name1 создается и имеет значение 18.

Функция genvarname имеет другую цель, которая должна генерировать допустимые и неконфликтные имена переменных, а не сами переменные.

+0

Как получить доступ к переменной позже в вашей функции? Например, если вы хотите увеличить «Name1»? Вы не можете просто «Name1 = Name1 + 1;», потому что «Name1» не знает заранее, не так ли? – beaker

+0

Нет, это сработало бы, так как eval фактически создает переменную Name1 в рабочей области. – Ratbert

+0

Как вы узнали, чтобы позже вызывать переменную 'Name1', но не при ее создании? – beaker

3

То, что вы видите в примере «Пример 4», обвиняется как плохой стиль программирования. В документации также содержится раздел, почему to avoid eval.

Я бы рекомендовал структуру с динамическими именами полей для достижения аналогичных.

filename='name1'; 
mydata=struct(); 
mydata.(genvarname(filename))=load(filename); 

Помимо лучшей производительности, вы также получаете дополнительную функциональность при работе с несколькими файлами. Например, structfun, чтобы применить функцию ко всем вашим данным или fieldnames, чтобы получить все имена файлов.

+2

В качестве побочного примечания ... string 'filename' должно быть допустимым именем свойства (без пробела,' '' и '', начинать с буквы, не должно быть ключевое слово и должно быть меньше ['namelengthmax'] (http: //fr.mathworks.com/help/matlab/ref/namelengthmax.html)) ... Действительность имени может быть проверена с помощью ['isvarname'] (http://fr.mathworks.com/help/matlab/ref/ isvarname.html) – CitizenInsane

+1

Плюс 1 для избежания 'eval'. Я бы сам сделал «структуру». – rayryeng

+0

Сторона примечания также, функция 'mex' [' mxCreateStructArray'] (http://fr.mathworks.com/help/matlab/apiref/mxcreatestructarray.html?searchHighlight=mxcreatestructarray) не проверяет ее параметры и позволяет создать структуру с недопустимым имена полей (см. этот [источник mex] (https://gist.github.com/CitizenInsane/88376e034571550a3b82)) ... Произошла ситуация не более 3 дней назад и сообщила об этой небольшой проблеме для TMW. – CitizenInsane

Смежные вопросы