Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MATLAB中将一个数字连接到一个变量名?_Matlab_Variables_Numbers - Fatal编程技术网

如何在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)