簡體   English   中英

如何修復 Octave 代碼中的索引錯誤?

[英]How do I fix the index error in my Octave code?

我的代碼索引有問題。 我正在嘗試在 Octave 上為冪方法(向量迭代)創建代碼,並且錯誤:'x(4): out of bound 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

分配給(尚)不存在的索引絕對沒問題; octave 將簡單地用“零”填充中間值。 例如

>> 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) ,其中 i < j。 因此,這會導致越界錯誤(當您只有i可用時,您正在嘗試訪問索引j )。

在您的特定情況下, octave 會通知您這發生在j4i3時。


PS:我會在這里回應@HansHirse 的暗示警告,你應該始終注意你的變量,並在你的腳本中適當地清除它們,特別是如果你打算多次運行它。 切勿使用事先未定義(或清除)的變量。 否則,當您再次運行腳本時,此處的x可能不會未定義,例如第二次。 這會導致各種問題,例如,您的代碼可以工作,但是由於錯誤的原因,然后當您在第二天運行它時再次無法工作並且x現在未定義。 在這個特定的示例中,如果您的工作區中有一個x並且其中包含正確數量的元素,那么您的代碼將“工作”但會產生錯誤的結果,並且您不會更好地了解。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM