如何在MATLAB中将一个数字连接到一个变量名?
我有一个变量如何在MATLAB中将一个数字连接到一个变量名?,matlab,variables,numbers,Matlab,Variables,Numbers,我有一个变量a=1。我想生成表单的变量名: variableNumber 所以在这个例子中,我想要 a1 a2 a3 作为变量。我该怎么做呢?使用assignin assignin('base', sprintf('variable%d', 1), 1:10) 编辑:正如JS提到的,结构通常更适合动态字段名。您可以这样使用它们: varnames = {'foo', 'bar'}; str = struct; for i = 1:length(varnames) str = s
a=1
。我想生成表单的变量名:
variableNumber
所以在这个例子中,我想要
a1
a2
a3
作为变量。我该怎么做呢?使用
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;
尝试
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}或其他什么
除非你有充分的理由这样做,否则最好是制作一个单元数组、结构数组、向量或其他东西。我对这个问题的回答是“你确定你真的想这样做吗?” 但如果你的答案是肯定的,那就是你的答案:
for k=1:5
eval(['a' num2str(k) '= k;'])
end
我已经将此代码用于一个具有自举神经网络的应用程序
% 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
虽然这当然是可能的(正如答案已经显示的那样),但在大多数情况下它并不是很有用。有什么原因不能使用结构或数组吗?很有趣。上周,我有一位非编程同事问了同样的问题。我的回答是“不要”。然后我向他展示了如何使用数组来达到同样的目的。我认为应该提到这一点:使用单元格数组、结构、3D数组或其他方式来存储数据,但不要在工作区中使用变量。请注意,只要所有条目都是数字且保证大小相同,就应该使用矩阵。它们的存储和处理效率高于单元阵列。小示例:
清除a;a(1,:,:)=兰特(3);a(2,:,:)=magic(3)