В математике и компьютерное программирование, индексная нотация используется для указания элементов массива чисел. Формализм использования индексов зависит от предмета. В частности, существуют разные методы для ссылки на элементы списка, вектора или матрицы, в зависимости от того, пишут ли вы формальную математическую статью для публикации или когда пишете компьютерную программу.
В математике часто бывает полезно ссылаться на элементы массива с помощью индексов. Индексы могут быть целыми числами или переменными. В общем случае массив принимает форму тензоров, поскольку их можно рассматривать как многомерные массивы. Особыми (и более знакомыми) случаями являются векторы (1d массивы) и матрицы (2d массивы).
Следующее является лишь введением в понятие: индексная нотация используется более подробно в математике (в частности, при представлении тензорных операций и манипулировании ими). См. Основную статью для получения дополнительной информации.
Вектор, рассматриваемый как массив чисел путем записи в виде вектора-строки или вектора-столбца (в зависимости от того, что используется в зависимости от удобства или контекста):
Обозначение индекса позволяет указать элементы массива, просто написав i, где индекс i, как известно, проходит от 1 до n, из-за n-мерности. Например, для вектора:
тогда некоторые записи:
Обозначение может применяться к векторам в математике и физике. Следующее векторное уравнение
также может быть записано в терминах элементов вектор (он же компоненты), то есть
, где индексы принимают заданный диапазон значений. Это выражение представляет собой набор уравнений, по одному для каждого индекса. Если каждый вектор имеет 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]
.
Все становится лучше Интересно, когда мы рассматриваем массивы с более чем одним индексом, например, двумерную таблицу. У нас есть три возможности:
В C все три метода могут быть используемый. Когда используется первый метод, программист решает, как элементы массива располагаются в памяти компьютера, и предоставляет формулы для вычисления местоположения каждого элемента. Второй метод используется, когда количество элементов в каждой строке одинаково и известно на момент написания программы. Программист объявляет, что массив имеет, скажем, три столбца, написав, например, тип элемента имя таблицы [3];
. Затем один обращается к конкретному элементу массива, записывая tablename [первый индекс] [второй индекс]
. Компилятор вычисляет общее количество ячеек памяти, занимаемых каждой строкой, использует первый индекс, чтобы найти адрес нужной строки, а затем использует второй индекс, чтобы найти адрес желаемого элемента в строке. Когда используется третий метод, программист объявляет таблицу как массив указателей, как в elementtype * tablename;
. Когда программист впоследствии указывает конкретный элемент tablename [первый индекс] [второй индекс]
, компилятор генерирует инструкции для поиска адреса строки, указанной первым индексом, и использования этого адреса в качестве основы, когда вычисление адреса элемента, указанного вторым индексом.
Эта функция умножает две матрицы 3x3 с плавающей запятой вместе.
void mult3x3f (float result [3], const float A [3], const float B [3]) {int i, j, k; for (i = 0; i < 3; ++i) { for (j = 0; j < 3; ++j) { result[i][j] = 0; for (k = 0; k < 3; ++k) result[i][j] += A[i][k] * B[k][j]; } } }
В других языках программирования, таких как Pascal, индексы могут начинаться с 1, поэтому индексирование в блоке памяти может быть изменено, чтобы соответствовать началу по 1 схема адресации с помощью простого линейного преобразования - в этой схеме ячейка памяти i-го элемента с базовым адресом b и размером элемента s равна b + (i - 1) s.