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