Octave 如何修复倍频程代码中的索引错误?

Octave 如何修复倍频程代码中的索引错误?,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' endf

我的代码索引有问题。我试图为幂法(向量迭代)创建一个八度的代码,错误:“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

在下一行中,请注意,
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]
然而,试图访问一个还不存在的索引是错误的,因为那里没有可访问的内容。这会导致“越界”错误(在错误消息中,octave足以告诉您在该特定数组中可以访问的最后一个合法索引是什么)

因此,这是一个错误:

>> clear x
>> x(3) = 1   % output: x = [0, 0, 1]
>> 1 + x(4)   % output: error: x(4): out of bound 3
现在回到您的特定代码,您正在尝试访问一些尚不存在的内容。它还不存在的原因是,您已经设置了for循环,以便在特定步骤中,
j
将获得比
i
更高的值,从而尝试访问尚不存在的
x(j)
,以便将其分配给
x(i)
,其中ii可用时,您试图访问索引
j

在您的特定情况下,octave通知您,当
j
4
,而
i
3
时,会发生这种情况



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

您的代码片段不是。缺少
x
的初始化。由于错误也源于
x
,因此您必须明确说明
x
是如何初始化的,以及在显示代码之前
x
可能发生的情况。@HansHirse我原则上同意,但实际上该示例是一个完全可复制的脚本;假设这是一个“新”终端,x未定义。@Tasos:但是如果在第一次循环中
x
未定义,为什么3是最后一个可用的索引?在计算将要分配的值之前,倍频程真的分配给了
x
?@CrisLuengo不,你是对的,x之前一定是初始化的,OP没有清除它。这将导致不同的错误,但无论如何。