Принимает ли Matlab нецелые индексы?
Конечно, нет! ... или так? Давайте сделаем несколько тестов.
определятьx = [10 20 30 40 50]
, Тогда любое из следующих утверждений, как и ожидалось, дает ошибку вMatlab (Индексы нижнего индекса должны быть либо действительными положительными целыми числами, либо логическими):
>> x(1.2)
>> x(-0.3)
>> x([1.4 2 3])
>> x([1.4 2.4 3.4])
>> x([1.4:4])
>> x(end/2)
Однако нецелые значения принимаются виндексы толстой кишки, Все последующие работы работают в последних версиях Matlab, хотя и с предупреждением (Целочисленные операнды требуются для оператора двоеточия при использовании в качестве индекса).
>> x(1.2:3)
ans =
10 20
>> x(0.4:3)
ans =
10 10 20
>> x(0.6:3)
ans =
10 20 30
>> x(1.2:0.7:5)
ans =
10 20 30 30 40 50
>> x(-0.4:3)
ans =
10 10 20 30
Это также работает, если выражение двоеточия включаетend
:
>> x(1.5:end-2)
ans =
20 30
>> x(1.5:end/6:end-1)
ans =
20 20 30 40
С другой стороны, следующее не работает и выдает ту же ошибку, что и выше:
>> x(-0.6:2)
>> x(-0.5:2)
Наблюдаемое поведение может бытьрезюмировать следующее:
Немноговнутреннее округление пинает, когдаиндекс толстой кишки используется. Индекс двоеточия является выражением формыa:b
или жеa:b:c
, Нет округления, когда массив индексации является стандартным массивом, таким как[a b c]
или даже[a:b]
или же[a:b:c]
.Округление сделано доближайшее целое числоза исключением того, что числа между-0.5
а также0.5
являютсяспециальные обсаженных: они округлены до1
вместо того, чтобы0
, Конечно, если целое число, полученное в результате округления, является отрицательным, возникает ошибка.Подобное поведение наблюдается в последних версияхоктава Кроме этого:
По-видимому, нормальное округление до ближайшего целого числа выполняется без обработки чисел между-0.5
а также0.5
как особый случай; и поэтому они дают ошибку:
>> x(0.4:3)
>> x(-0.4:3)
Ошибка выдается, когда нецелочисленный диапазон содержит одно значение:x(2.4:4)
работает, ноx(3.4:4)
не (конечно,x([2.4 3.4])
а такжеx(3.4)
тоже не работает).
Кроме этого, результаты такие же, как в Matlab, и выдается предупреждение (Нецелочисленный диапазон, используемый в качестве индекса).
Предупреждения и тот факт, что Octave работает так же, как Matlab, предполагают, что этопредназначена поведение. Этодокументированный где-то? Кто-нибудь может датьбольше информации или пролить свет на это?