Как объединить число с именем переменной в MATLAB?

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

variableNumber  

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

a1
a2
a3

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

5 ответов


попробовать 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, если вам нужно динамическое именование переменных.


мой ответ на этот вопрос "вы уверены, что действительно этого хочешь?"

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

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

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

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

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

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

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


использовать 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;

мой ответ на этот вопрос "вы уверены, что действительно этого хочешь?"

но если ваш ответ да, то ваш ответ:

for k=1:5
  eval(['a' num2str(k) '= k;'])
end

Я использую этот код для приложения с Bootstrap нейронных сетей

% k fold test with automatic division of data

warning off

% read in X
% read in T

% perform k fold division of input time series called 'K-fold Cross-Validation
% Bootstrap'

CVO = cvpartition(X,'k',10); % creates 10 sub samples of 'X' and divides it into 'training (i.e training and validation)' and 'testing' sets

for i = 1:CVO.NumTestSets
    eval(['xtv' num2str(i) '=X(CVO.training(i));']) % cross-validation training sets of 'X'
    eval(['xt' num2str(i) '=X(CVO.test(i));']) % cross-validation testing set of 'X'
    eval(['ttv' num2str(i) '=T(CVO.training(i));']) % cross-validation training set of 'T'
    eval(['tt' num2str(i) '=T(CVO.test(i));']) % cross-validation testing set of 'T'
end