Создание переменных с именами из строк

Предположим, что я хочу создать 10 переменных, которые выглядели бы так:

x1 = 1;
x2 = 2;
x3 = 3;
x4 = 4;
.
.
xi = i;

Это упрощенная версия того, что я намереваюсь сделать. В принципе, я просто хочу сохранить коды кода, создав эти переменные автоматическим способом. Есть ли возможность построить имя переменной в Matlab? Образец в моем примере будет ["x", num2str(i)]. Но я не могу найти способ создать переменную с этим именем.

Ответы

Ответ 1

Вы можете сделать это с помощью eval, но вы действительно должны не

eval(['x', num2str(i), ' = ', num2str(i)]); %//Not recommended

Скорее используйте массив ячеек:

x{i} = i

Ответ 2

Я также настоятельно рекомендую использовать массив ячеек или структуру для таких случаев. Я думаю, что это даже даст вам некоторое повышение производительности.

Если вам действительно нужно это сделать, Дэн рассказал, как это сделать. Но я хотел бы также указать на функцию genvarname. Он будет гарантировать, что ваша строка является допустимым именем переменной.

EDIT: genvarname является частью ядра, а не инструментария статистики

Ответ 3

for k=1:10
   assignin('base', ['x' num2str(k)], k)
end

Ответ 4

Если кому-то еще интересно, правильный синтаксис ответа от Dan:

eval(['x', num2str(i), ' = ', num2str(i)]);

В моем вопросе уже содержится неправильный синтаксис, так что это моя ошибка.

Ответ 5

Хотя это давно назрело, я просто хотел добавить еще один ответ.

функция genvarname предназначена именно для этих случаев

и если вы используете его с массивом структуры tmp, вам не понадобится eval cmd

пример 4 из этой ссылки: как это сделать http://www.mathworks.co.uk/help/matlab/ref/genvarname.html

 for k = 1:5
   t = clock;
   pause(uint8(rand * 10));
   v = genvarname('time_elapsed', who);
   eval([v ' = etime(clock,t)'])
   end

все лучшее

Eyal

Ответ 6

Мне нужно было что-то вроде этого, потому что вы не можете ссылаться на структуры (или массивы ящиков, которые, как я полагаю), из рабочей области в блоках Simulink, если вы хотите иметь возможность изменять их во время моделирования.

В любом случае, для меня это лучше всего работало

assignin('base',['string' 'parts'],values);