Принимает ли Matlab нецелые индексы?

28

Конечно, нет!... Или это так? Проделайте несколько тестов.

Определите 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, хотя и с предупреждением (Integer операнды необходимы для оператора двоеточия, когда используются в качестве индекса).

>> 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. Конечно, если целое число, полученное в результате округления, отрицательно, возникает ошибка.

Подобное поведение наблюдается в последних версиях Octave, за исключением того, что:

  • По-видимому, выполняется нормальное округление до ближайшего целого, не рассматривая числа между -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, предполагает, что это поведение предназначено. Является ли он документированным? Может ли кто-нибудь дать больше информации или пролить свет на это?

  • 0
    какую версию matlab / octave вы используете? с R2009a не работает ... Кто-нибудь может проверить и другие версии?
  • 0
    Мой R2014b действует как @Luis, описавший поведение Octave. Он принимает все, кроме x(0.4:3) и x(-0.4:3) .
Показать ещё 5 комментариев
Теги:
arrays
matrix-indexing
octave

1 ответ

4
Лучший ответ

Дополнительные наблюдения:

  • x(1.2:3) следует теоретически интерпретировать как: subsref(x, substruct('()',1.2:3)). Однако, как упоминалось в вопросе, "Без округления происходит, когда индексный массив является стандартным массивом", что приводит к сбою явной индексированной ссылки. Это говорит о том, что механизм, похожий на логическое короткое замыкание или, возможно, многопоточное разбиение на разделы ( где промежуточная переменная "не создана" ) имеет место.

  • Выданный предупреждающий идентификатор MATLAB:colon:nonIntegerIndex.

Теория:

  • Возможно, существуют перегруженные версии индексированной ссылки, где есть начальный этап определения того, являются ли сами индексы целыми числами или нет. Если это не так, MATLAB "перенаправляет" это на другое семейство классов (пример).

Официальные комментарии:

  • Это то, что Стив Эддинс из TMW должен был сказать по этому поводу:

    ... в самые ранние дни исполнители MATLAB имели тенденцию быть максимально допустимыми в отношении проверки ввода. Со временем мы поняли, что эта философия не всегда была лучшей для пользователей, и мы начали делать некоторые из языковых правил более жесткими и более регулярными. Одним из примеров было введение сообщений об ошибках в отношении недопустимых индексов (noninteger, неположительных и т.д.). Однако мы не могли постоянно подтягивать поведение столько, сколько нам понравилось. Иногда это было потому, что мы обнаружили, что слишком много кода пользователя использует исходное поведение. Это одна из причин, по которой вы по-прежнему наблюдаете такое изменение поведения в некоторых местах.... Я бы посоветовал пользователям использовать только индексы с целыми значениями. Пользователи могут явно называть раунд или пол или что угодно, чтобы преобразовать вывод оператора двоеточия в целочисленное значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню