Как объединить число с именем переменной в 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