В математике и программировании индексная нотация используется для указания элементов массива чисел. Формализм использования индексов различается в зависимости от предмета. В частности, существуют различные методы для ссылки на элементы списка, вектора или матрицы в зависимости от того, пишется ли формальная математическая статья для публикации или когда пишется компьютерная программа .
В математике часто бывает полезно ссылаться на элементы массива с помощью индексов. Индексы могут быть целыми числами или переменными . Массив в общем случае принимает форму тензоров , поскольку их можно рассматривать как многомерные массивы. Особыми (и более привычными) случаями являются векторы (массивы 1d) и матрицы (массивы 2d).
Ниже приведено лишь введение в концепцию: индексная нотация используется более подробно в математике (в частности, в представлении и манипулировании тензорными операциями ). Более подробную информацию см. в основной статье.
Вектор, рассматриваемый как массив чисел, записанный как вектор-строка или вектор-столбец (в зависимости от того, какой вариант используется, зависит от удобства или контекста):
Индексная нотация позволяет указывать элементы массива, просто записывая a i , где известно, что индекс i изменяется от 1 до n из-за n-мерности. [1] Например, если задан вектор:
то некоторые записи
Обозначение может быть применено к векторам в математике и физике . Следующее векторное уравнение
также может быть записано в терминах элементов вектора (т.е. компонентов), то есть
где индексы принимают заданный диапазон значений. Это выражение представляет собой набор уравнений, по одному для каждого индекса. Если векторы имеют n элементов, то есть i = 1,2,… n , то уравнения явно
Таким образом, индексная нотация служит эффективным сокращением для
Для описания массивов чисел в двух или более измерениях, таких как элементы матрицы, используется более одного индекса (см. также изображение справа);
Запись матрицы A записывается с использованием двух индексов, скажем i и j , с запятыми или без них для разделения индексов: a ij или a i,j , где первый нижний индекс — это номер строки, а второй — номер столбца. Сопоставление также используется в качестве обозначения для умножения; это может быть источником путаницы. Например, если
то некоторые записи
Для индексов больше 9 предпочтительнее использовать запись с запятой (например, 3,12 вместо 312 ) .
Матричные уравнения записываются аналогично векторным уравнениям, например:
с точки зрения элементов матриц (т.е. компонентов)
для всех значений i и j . Опять же, это выражение представляет собой набор уравнений, по одному для каждого индекса. Если каждая матрица имеет m строк и n столбцов, то есть i = 1, 2, …, m и j = 1, 2, …, n , то существует mn уравнений.
Нотация допускает четкое обобщение на многомерные массивы элементов: тензоры. Например,
представляющий собой набор многих уравнений.
В тензорном анализе верхние индексы используются вместо нижних, чтобы различать ковариантные и контравариантные сущности, см. ковариация и контравариантность векторов , а также повышение и понижение индексов .
В нескольких языках программирования индексная нотация является способом адресации элементов массива. Этот метод используется, поскольку он наиболее близок к тому, как он реализован в языке ассемблера , где адрес первого элемента используется в качестве базы, а кратное (индекс) размера элемента используется для адресации внутри массива.
Например, если массив целых чисел хранится в области памяти компьютера, начиная с ячейки памяти с адресом 3000 ( базовый адрес ), и каждое целое число занимает четыре ячейки (байта), то элементы этого массива находятся в ячейках памяти 0x3000, 0x3004, 0x3008, …, 0x3000 + 4( n − 1) (обратите внимание на нумерацию, начинающуюся с нуля ). В общем случае адрес i -го элемента массива с базовым адресом b и размером элемента s равен b + is .
В языке программирования C мы можем записать вышеприведенное как *(base + i)
(форма указателя) или base[i]
(форма индексации массива), что полностью эквивалентно, поскольку стандарт C определяет форму индексации массива как преобразование в форму указателя. По совпадению, поскольку сложение указателей коммутативно, это допускает неясные выражения, такие как , 3[base]
что эквивалентно base[3]
. [2]
Все становится интереснее, когда мы рассматриваем массивы с более чем одним индексом, например, двумерную таблицу. У нас есть три возможности:
В языке C можно использовать все три метода. При использовании первого метода программист решает, как элементы массива будут размещены в памяти компьютера, и предоставляет формулы для вычисления местоположения каждого элемента. Второй метод используется, когда количество элементов в каждой строке одинаково и известно на момент написания программы. Программист объявляет массив, скажем, с тремя столбцами, записывая, например elementtype tablename[][3];
, . Затем один ссылается на конкретный элемент массива, записывая tablename[first index][second index]
. Компилятор вычисляет общее количество ячеек памяти, занимаемых каждой строкой, использует первый индекс для поиска адреса нужной строки, а затем использует второй индекс для поиска адреса нужного элемента в строке. При использовании третьего метода программист объявляет таблицу массивом указателей, как в elementtype *tablename[];
. Когда программист впоследствии указывает конкретный элемент tablename[first index][second index]
, компилятор генерирует инструкции для поиска адреса строки, указанной первым индексом, и использует этот адрес в качестве базы при вычислении адреса элемента, указанного вторым индексом.
void mult3x3f ( float result [][ 3 ], const float A [][ 3 ], const float B [][ 3 ]) { int i , j , k ; для ( i = 0 ; i < 3 ; ++ i ) { для ( j = 0 ; j < 3 ; ++ j ) { result [ i ][ j ] = 0 ; для ( k = 0 ; k < 3 ; ++ k ) result [ i ][ j ] += A [ i ][ k ] * B [ k ][ j ]; } } }
В других языках программирования, таких как Pascal, индексы могут начинаться с 1, поэтому индексацию в блоке памяти можно изменить для соответствия схеме адресации «начиная с 1» с помощью простого линейного преобразования — в этой схеме расположение в памяти i -го элемента с базовым адресом b и размером элемента s равно b + ( i − 1) s .