Как исправить ошибку индексации в моем коде Octave? - PullRequest
0 голосов
/ 29 октября 2019

У меня проблемы с индексом для моего кода. Я пытаюсь создать код на Octave для метода power (векторная итерация), и ошибка: '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

1 Ответ

1 голос
/ 30 октября 2019

В следующей строке обратите внимание, что у вас есть 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 на конкретном шаге, так что вы пытаетесь получить доступ к x(j), что делаетеще не существует, чтобы присвоить его x(i), где i j, когда доступно только до i).

В вашем конкретном случае октава сообщает вам, что это произошло, когда j было 4, а i было 3.


PS: здесь я повторю подразумеваемое предупреждение @ HansHirse, что вы всегда должны обращать внимание на свои переменные, иочистите их соответствующим образом в ваших сценариях, особенно если вы планируете запускать его много раз. Никогда не используйте переменную, которую вы не определили (или не очистили) заранее. В противном случае x здесь не может быть неопределенным при запуске вашего сценария, скажем, во второй раз. Это приводит к всевозможным проблемам, например, ваш код работает, но по неправильным причинам, а затем снова не работает, когда вы запускаете его на следующий день, и x теперь не определено. В этом конкретном примере, если в вашей рабочей области было x, в котором было правильное количество элементов, ваш код "работал бы", но приводил к неправильному результату, и вы не знали бы ничего лучше.

...