Matlab 理解不断增长的向量
Posted
技术标签:
【中文标题】Matlab 理解不断增长的向量【英文标题】:Matlab understand growing vectors 【发布时间】:2015-04-15 16:12:38 【问题描述】:我想增长一个列向量(不知道最后会多长)。
我有一个测试代码。然而,我对它的行为感到困惑。
初始化 vel=[0]
时,向量会很好地增长。当使用vel=[1]
初始化时,它不会。我收到以下错误消息:“Attempted to access vel(2); index out of bounds because numel(vel)=1.
”
这是为什么呢?我的向量的第一个元素是什么不应该有所不同,或者是吗? 谢谢你把这个告诉我。
找到下面的代码:
vel=[0]
k=1
v=0
for i=1:10;
if v>= vel(k)
vel(k+1)=v %stores all v values, for plotting and analysis of v0 behaviour
end
%assignin('base','vel',vel)
k=k+1
v=v+1
end
【问题讨论】:
为什么不用cell数组,之后再转换成数组呢? @kkuilla 这将如何改变? 您不会遇到不断增长的数组的意外行为。您知道循环后单元格的大小,并且可以预先分配它。 元胞数组仍然是数组,它们只是对另一个对象的引用数组。 【参考方案1】:是的,它确实有所作为。这是因为你的 if 语句:如果vel(1) = [1]
,循环只运行两次:如果0 >= 1
不为真,则永远不会生成vel(2)
。这就是为什么您会收到“越界”错误。
此外,我建议在 for 循环中使用 i。
【讨论】:
啊,天哪,愚蠢的错误...非常感谢您向我指出这一点 =)【参考方案2】:问题出在这一行:if v>= vel(k)
。
这意味着,在vel=[0]
的情况下,在第一次迭代中v
是0
,这与vel(1)
相同,所以会执行vel(k+1)=v
行。然后,在第二个循环中,vel(k)
是您之前添加的 vel(2)
。
但是,在vel=[1]
的情况下,在第一次迭代中v
仍然是0
,它小于vel(1)
,所以vel(k+1)=v
行不会被执行。这意味着,在第二个循环中,它会尝试执行 if v>= vel(2)
,但由于您在第二个循环期间没有附加到数组,因此索引不存在。
你应该这样做:
for i=1:10;
if v>= vel(k)
vel(k+1)=v;
%assignin('base','vel',vel)
k=k+1;
v=v+1:
end
end
这样,您只有在实际找到附加项时才移动到下一个值(是否要在 if
测试中使用 v
取决于您要执行的操作)。
【讨论】:
【参考方案3】:您无法访问超出范围的索引,但您可以创建它并扩展数组。
value = 1;
value = arr(end+1); %Not allowed
arr(end+1) = value; %Allowed
当您有起始条件vel = [1]
时,条件v>= vel(k)
对于第一个循环为假,并且您没有输入增长数组的 if 语句。对于下一个循环,您尝试访问不存在的 vel(2)
。
【讨论】:
以上是关于Matlab 理解不断增长的向量的主要内容,如果未能解决你的问题,请参考以下文章