我有一个变量a = 1
。我想生成一个表单的变量名称:
variableNumber
所以在这个例子中,我想要
a1
a2
a3
作为变量。我怎么能这样做?
答案 0 :(得分:20)
我对这个问题的回答是“你确定你真的想这么做吗?”
如果您有一系列这样的变量,那么您将不得不想办法在以后引用所有这些变量,这可能意味着EVAL或其他类似的变量。
如果你知道你将存储的所有内容都是标量,你可以将它们全部存储在一个向量中:
a(1) = 1;
a(2) = 2;
a(3) = 3;
如果你没有标量怎么办?
a{1} = 1;
a{2} = 'Doug';
a{3} = [1 2 3 4];
然后你可以将它们称为{1}或其他。
除非你有充分的理由这样做,否则你最好制作一个单元格数组,结构数组,向量或其他东西。
答案 1 :(得分:9)
尝试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数据类型,如果你需要动态变量命名。
答案 2 :(得分:5)
使用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;
答案 3 :(得分:2)
我对这个问题的回答是“你确定你真的想这么做吗?”
但如果您的答案是肯定的,那么这就是您的答案:
for k=1:5
eval(['a' num2str(k) '= k;'])
end
答案 4 :(得分:0)
我一直在将此代码用于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