Как связать число с именем переменной в MATLAB? - PullRequest
7 голосов
/ 11 мая 2010

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

variableNumber  

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

a1
a2
a3

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

Ответы [ 5 ]

20 голосов
/ 11 мая 2010

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

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

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

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

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

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

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

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

9 голосов
/ 11 мая 2010

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

5 голосов
/ 11 мая 2010

Использование assignin.

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

РЕДАКТИРОВАТЬ: Как упоминалось 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;
2 голосов
/ 10 июня 2010

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

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

for k=1:5
  eval(['a' num2str(k) '= k;'])
end
0 голосов
/ 15 декабря 2012

Я использую этот код для приложения с нейронными сетями 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
...