Принимает ли 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 are специальные регистр: они округлены до 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, и предупреждение также выдается (нецелочисленный диапазон, используемый в качестве индекса).

предупреждения и тот факт, что Октава работает аналогично Matlab предполагают, что это предназначены поведение. Это документирована где-то? Может кто-нибудь дать более подробная информация или пролить свет на это?

1 ответов


дополнительные замечания:

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

  • идентификатор выданного предупреждения MATLAB:colon:nonIntegerIndex.

теория:

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

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

  • это Стив Эддинс из TMW пришлось сказать на эту тему:

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