Можно ли использовать символы в качестве индексов?

Определим, например,

x = 10:10:2000;

Как известно, в качестве индексов можно использовать целые значения:

>> x(9)
ans =
    90

В Matlab символы часто можно использовать там, где ожидается число, при этом Matlab выполняет преобразование автоматически. Например, поскольку код ASCII 'a' равен 97,

>> 'a'+1
ans =
    98

Можно ли также использовать символы в качестве индексов? Преобразует ли Matlab их в целые числа?


person Luis Mendo    schedule 23.03.2016    source источник


Ответы (1)


Их можно использовать... но будьте осторожны, если индекс представляет собой одно двоеточие!

Давайте определим

>> x = 10:10:2000;

Индексация с помощью 'a' дает 97-й элемент x, как и ожидалось:

>> x('a')
ans =
   970

Однако индексирование с помощью ':' — это особый случай. Строка ':' действует как индекс :, создавая таким образом вектор-столбец всех значений x. То есть x(':') совпадает с x(:):

>> x(':')
ans =
          10
          20
          30
         ...
        1990
        2000

Это означает, что индекс ':' вычисляется (x(':') действует как x(:)), тогда как другие массивы символов, используемые в качестве индексов, не оцениваются (x('a') не действует как x(a)):

>> a = 1;
>> x('a')
ans =
   970

Это также означает, что с ':' преобразование в числовой тип перед индексацией имеет значение, в отличие от других символов, используемых в качестве индексов:

>> x(double('abc'))
ans =
   970   980   990
>> x('abc')
ans =
   970   980   990

>> x(double(':'))
ans =
   580
>> x(':')
ans =
          10
          20
          30
         ...
        1990
        2000

Оцененное поведение ':', используемого в качестве индекса, было уже известно. Что удивительно, так это контраст с другими символами или массивами символов, используемыми в качестве индексов (которые не оцениваются).

В примерах для простоты используется одно измерение, но описанное поведение также применимо к многомерному индексированию. Такое же поведение наблюдается и в Octave.

person Luis Mendo    schedule 23.03.2016
comment
Одного я не понимаю: как, черт возьми, Октав узнал, что нужно это проверить? :) Мог ли subsref быть открытым исходным кодом в первые дни? - person Andras Deak; 24.03.2016
comment
@AndrasDeak Хороший вопрос! См. этот комментарий - person Luis Mendo; 24.03.2016
comment
О, очень прикольный пост, а также дает законную причину такого странного поведения. - person Andras Deak; 24.03.2016
comment
@AndrasDeak Индекс ':' (строка) упоминается здесь: Двоеточие, используемое в качестве индекса, передается [...] как символ двоеточия ':'. Диапазоны, указанные с помощью двоеточия (например, 2:5), расширяются до 2 3 4 5. - person Luis Mendo; 24.03.2016
comment
Так что это технически не недокументировано, только во всех смыслах и целях;) - person Andras Deak; 24.03.2016
comment
Хороший пост @LuisMendo. Я должен буду хранить это в глубине души. Я уверен, что это пригодится в будущем, когда кто-то захочет объединить несколько переменных в полезную структуру данных. - person Suever; 24.03.2016
comment
@Suever Спасибо! Использование ':' в качестве двоеточия действительно полезно (как в ответе, который я связал). Но для Matlab выделение конкретного символа таким образом странно. - person Luis Mendo; 24.03.2016