如何解决八度代码中的索引错误?

时间:2019-10-29 20:52:45

标签: octave

我的代码索引有问题。我正在尝试在Octave上为幂方法(矢量迭代)创建代码,并且错误:“ x(4):越界3”一直在第6行弹出。

    A=[6,-2,2,4;0,-4,2,2;0,0,2,-5;0,0,0,-3]
    b=[12;10;-9;-3]
    n=4
    for i=rows(A):-1:1
     for j=i+1:rows(A)
      x(i)=[b(i)-A(i,j)*x(j)]/A(i,i); #error: 'x(4): out of bound 3'
     endfor
    endfor 
    x

1 个答案:

答案 0 :(得分:1)

在下面的行中,请注意您有两次出现x;第一个试图分配给它,但是第二个试图访问它的值:

x(i) = [ b(i) - A(i,j) * x(j) ] / A(i,i);
⬑ assignment             ⬑ access

分配给尚不存在的索引是完全可以的;八度会简单地用“零”填充中间值。例如

>> clear x
>> x(3) = 1    % output: x = [0, 0, 1]

但是,尝试访问一个尚不存在的索引是错误的,因为没有可访问的索引。这将导致“越界”错误(并且在其错误消息中,倍频程足以告诉您在该特定数组中可以访问的最后一个合法索引是什么。)

因此,这是一个错误:

>> clear x
>> x(3) = 1   % output: x = [0, 0, 1]
>> 1 + x(4)   % output: error: x(4): out of bound 3

现在回到您的特定代码,您正在尝试访问尚不存在的内容。它尚不存在的原因是,您已设置了for循环,以使j在特定步骤中将比i获得更高的值,从而使您尝试访问{{ 1}}(尚不存在),以便将其分配给{<1}},其中i x(j)个可用空间时,您尝试访问索引x(i))。

在您的特定情况下,八度会通知您这是在ji,而j4时发生的。


PS:我将在这里回应@HansHirse的隐含警告,您应始终注意您的变量,并在脚本中适当地清除它们,特别是如果您计划多次运行它。切勿使用尚未定义(或清除)的变量。否则,第二次运行脚本时,此处的i可能未定义。这会导致各种各样的问题,例如,您的代码可以工作,但是出于错误的原因,然后在第二天运行它时又无法工作,并且3现在未定义。在这个特定的示例中,如果您的工作区中有一个x,其中有正确数量的元素,那么您的代码将“起作用”,但产生错误的结果,您将一无所知。