Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.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_Vector - Fatal编程技术网

Matlab理解生长向量

Matlab理解生长向量,matlab,vector,Matlab,Vector,我想增加一个列向量(不知道它到底需要多长时间)。 我有一个测试代码。然而,我对它的行为感到困惑。 初始化vel=[0]时,向量增长良好。当使用vel=[1]初始化时,它不会。我收到以下错误消息:“试图访问vel(2);索引超出范围,因为numel(vel)=1。” 为什么呢?向量的第一个元素是什么,应该没有区别,或者它是什么? 谢谢你把这个告诉我 找到下面的代码: vel=[0] k=1 v=0 for i=1:10; if v>= vel(k)

我想增加一个列向量(不知道它到底需要多长时间)。 我有一个测试代码。然而,我对它的行为感到困惑。 初始化
vel=[0]
时,向量增长良好。当使用
vel=[1]
初始化时,它不会。我收到以下错误消息:“
试图访问vel(2);索引超出范围,因为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

是的,这确实有区别。这是因为您的if语句:如果
vel(1)=[1]
,则循环只运行两次:
vel(2)
,如果
0>=1
不为真,则永远不会生成
vel(2)
。这就是为什么会出现“越界”错误


此外,我建议在for循环中使用I。

是的,它确实会有所不同。这是因为您的if语句:如果
vel(1)=[1]
,则循环只运行两次:
vel(2)
,如果
0>=1
不为真,则永远不会生成
vel(2)
。这就是为什么会出现“越界”错误


此外,我建议在for循环中使用I。

问题在于这一行:
如果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
行不会执行。这意味着,在第二个循环中,如果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
test中执行
v
,取决于您正试图执行的操作)。

问题在于这一行:
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
行不会执行。这意味着,在第二个循环中,如果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
测试取决于您正试图执行的操作)。

您无法访问超出范围的索引,但允许您创建它并扩展数组

value = 1;
value = arr(end+1); %Not allowed
arr(end+1) = value; %Allowed

当您有起始条件
vel=[1]
时,第一个循环的条件
v>=vel(k)
为false,并且您不需要在增加数组的位置输入if语句。对于下一个循环,您尝试访问不存在的
vel(2)

您不能访问超出边界的索引,但可以创建它并扩展数组

value = 1;
value = arr(end+1); %Not allowed
arr(end+1) = value; %Allowed

当您有起始条件
vel=[1]
时,第一个循环的条件
v>=vel(k)
为false,并且您不需要在增加数组的位置输入if语句。在下一个循环中,您尝试访问不存在的
vel(2)

为什么不使用数组,并在之后将其转换为数组?@kkuilla这将如何改变任何事情?您不会有不断增长的数组的不可预测的行为。你知道循环后单元格的大小,可以预先分配。单元格数组仍然是数组,它们只是指向另一个对象的引用数组。为什么不使用数组,然后将其转换为循环后的数组?@kkuilla这会改变什么?你不会有一个不断增长的数组的不可预测的行为。你知道循环后单元格的大小,可以预先分配。单元格数组仍然是数组,它们只是指向另一个对象的引用数组。啊,天哪,愚蠢的错误。。。非常感谢你向我指出这一点=)啊,天哪,愚蠢的错误。。。非常感谢您向我指出这一点=)