Как связать число к имени переменной в MATLAB?

У меня есть переменная a = 1. Я хочу генерировать имя переменной формы:

variableNumber  

Таким образом в этом примере, я хотел бы

a1
a2
a3

как переменные. Как я могу сделать это?

7
задан Yamaneko 13 August 2012 в 19:25
поделиться

4 ответа

Попробуйте genvarname

varname = genvarname(str)

- это основной синтаксис для использования. В документации MATLAB есть подробные примеры использования этой функции со списком исключений (для обеспечения уникальности имен переменных). Вам придется использовать eval или другую функцию (например, assignin, упомянутую в предыдущем ответе) для использования этого имени переменной.

Чтобы полностью ответить на вопрос,

varnamelist = genvarname({'a','a','a','a','a'});
for l=1:length(varnamelist)
  eval([varnamelist{l} '= l^2']);
end

Конечно, есть более эффективные способы составления списка ввода для genvarname, это оставим как упражнение ;)

Если вас беспокоит производительность, обратите внимание, что eval может сильно замедлить работу скрипта/функции; лично я бы рекомендовал использовать типы данных struct или cell, если вам нужно динамическое именование переменных.

8
ответ дан 6 December 2019 в 05:42
поделиться

Используйте assignin.

assignin('base', sprintf('variable%d', 1), 1:10)

EDIT: Как упоминал JS, структуры, как правило, лучше подходят для динамических имен полей. Вы можете использовать их следующим образом:

varnames = {'foo', 'bar'};
str = struct;
for i = 1:length(varnames)
   str = setfield(str, varnames{i}, rand); %#ok<SFLD>
end

str =    
     foo: 0.4854
     bar: 0.8003

Или даже проще, например:

str2.('alpha') = 123;
str2.('beta') = 1:10;
4
ответ дан 6 December 2019 в 05:42
поделиться

Мой ответ на этот вопрос: «Вы уверены, что действительно хотите это сделать?»

Если у вас есть ряд подобных переменных, тогда у вас будет чтобы найти способ ссылаться на все эти переменные позже, это, вероятно, будет означать EVAL или что-то еще в этом роде.

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

a(1) = 1;
a(2) = 2;
a(3) = 3;

Что делать, если у вас нет скаляров?

a{1} = 1;
a{2} = 'Doug';
a{3} = [1 2 3 4];

Тогда вы можете ссылаться на них как на { 1} или что-то еще.

Если у вас нет веской причины для этого, вам лучше создать массив ячеек, массив структур, вектор или что-то еще.

19
ответ дан 6 December 2019 в 05:42
поделиться

Мой ответ на этот вопрос: «Вы уверены, что действительно хотите это сделать?»

Но если ваш ответ ДА, то это ваш ответ:

for k=1:5
  eval(['a' num2str(k) '= k;'])
end
2
ответ дан 6 December 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: