常见问题:我如何创建变量A1, A2,…,A10在循环?

浏览次数2007次(过去30天)
1月
1月 2012年12月26日
编辑: Stephen23 2020年1月1日
如何创建变量A1, A2,…, A10在循环?
6个评论
1月
1月 2019年3月15日
[从旗帜移动] 亚历山大THIBEAULT 在Stephen的评论中写道:
“拜托,我们不会阅读所有页面的所有内容……我们正在寻找解决方案。”
当你向下滚动并阅读答案时,你会找到答案。在过去的几年里,经过数百次的讨论,斯蒂芬的详尽解释是必须的。

登录评论。

接受的答案

1月
1月 2012年12月26日
编辑:1月 2017年4月24日
请不要这样做! 您将发现MATLAB数组(数字或单元格)将让您以更快、更易于阅读的方式完成相同的事情。例如,如果A1到A10包含标量,则使用:
A = 0 (1,10);没有必要,只是快多了。
i = 1:10
(我)=%某方程
结束
现在,当你指Ai时,就指A(i)。如果每个Ai包含一个向量或矩阵,每个都有不同的大小,你想要使用单元格数组,这正是为了这个:
i = 1:10
A{i} = 1:i;
结束
注意,每个A{i}包含不同大小的矩阵。注意下标要用大括号!
另一种鱼与熊掌兼得的方法是使用结构而不是单元格数组。结构的字段可以是您想要的变量名。你可以用动态字段引用对它们进行索引。例如:
名称= {"弗雷德" "萨姆" "艾尔"};
Ind = 1:长度(名称)
s (names{ind}) = magic(长度(names{ind}));
结束
在这种情况下,您最终得到变量s,一个结构,包含由存储在单元格数组名称中的字符串指定的字段。
现在,如果您仍然希望使用动态生成的名称创建变量,则需要使用EVAL。使用EVAL,您可以使用MATLAB命令生成执行您想要的操作的字符串。例如,eval('A=10')与A=10具有相同的效果,eval(['A' 'B' '=10'])与AB=10具有相同的效果,只是eval方法执行得慢得多。所以在循环中,你可以使用:
i = 1:10
eval (sprintf ('A%d = [1:i]',我));
结束
注意这有多混乱。此外,这可能会导致你的代码中难以解决问题,特别是如果你试图动态创建一个与函数同名的变量:
函数Y = mysin(x)
eval ('罪恶= 5;');
Y = sinx;
用"y = mysin(1)"调用这个函数将不会返回y = 5 (EVAL创建的sin变量的第一个元素)——它将返回sin(1),因为在解析函数时没有名为sin的变量,因此在最后一行中使用sin被解析为对内置sin函数的调用。一个名为sin的变量在运行时存在的事实无关紧要;解析时间“决策”优先。
重复:不要在运行时使用EVAL创建变量,除非您有非常好的理由,例如,有人给了您一个包含2000个变量的MAT文件,名为A1428。即使在这种情况下,你也可以避免EVAL:
假设mat文件example1。mat包含2000个变量,从A1到A2000
S =负载(“example1.mat”);
% S现在是一个具有2000个字段的结构数组,从S. a1到S. a2000。
要访问A1428,请使用:
x1 = S.A1428;
如果你想访问的变量的“索引”存储在一个变量中:
K = 1428;
x2 = s (sprintf(“% d '、k));
x3 = s ([“一个”, num2str (k)]);
1评论
爱德华·拜尔斯
爱德华·拜尔斯 2016年7月19日
嗨,有没有一个好方法来存储多个迭代线性模型对象?例如,使用索引符号,可以很容易地循环和调用特定的实例,我尝试过:
Mdl {x} = fitlm(tbl,modelspec);
但这是行不通的,因为:“对FitObject不允许使用()赋值。”

登录评论。

更多答案(2)

罗伯特·卡明
罗伯特·卡明 2014年9月10日
编辑:罗伯特·卡明 2014年9月10日
我完全同意Jan的观点 动态创建新变量 是一种 应该避免 -但如果你必须这样做,请考虑以下替代方法:
函数generateVariableOnFly
%让tic/toc比较eval和assignin的使用
抽搐
eval ('a = 0 (10,10);'
toc
另一种方法是使用
在调用方函数中赋值变量的子函数:
抽搐
variableCreator (“b”, 0 (10,10))
toc
%验证a和b都存在并且是相同的:
Isequal (a, b)
结束
使用子函数在调用方函数中赋值变量:
函数variableCreator (newVar, variable)
assignin (“来电”, newVar,变量);
结束
要完成Jans的例子,你可以用下面的方式来使用:
2 = 1:10
变量(sprintf)%我的, ii), ii)
结束
这将创建变量A1, A2....A10。
3评论
Stephen23
Stephen23 2020年1月1日
编辑:Stephen23 2020年1月1日
@ Oussama himani HAYANE :使用索引。建立索引比你正在尝试做的事情要简单和高效得多:
A(5) = 8;
A(5) = 19;
索引在介绍性教程中解释得很好:
您需要编写如此缓慢、复杂、混乱的代码是否有特殊原因?

登录评论。


shahil kushwaha
shahil kushwaha 2017年6月13日
非常感谢

类别

了解更多循环和条件语句帮助中心而且文件交换

世界杯预选赛小组名单社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!世界杯预选赛小组名单

开始狩猎!

Baidu
map