stringtranslate.com

Индексная нотация

В математике и программировании индексная нотация используется для указания элементов массива чисел. Формализм использования индексов различается в зависимости от предмета. В частности, существуют различные методы для ссылки на элементы списка, вектора или матрицы в зависимости от того, пишется ли формальная математическая статья для публикации или когда пишется компьютерная программа .

В математике

В математике часто бывает полезно ссылаться на элементы массива с помощью индексов. Индексы могут быть целыми числами или переменными . Массив в общем случае принимает форму тензоров , поскольку их можно рассматривать как многомерные массивы. Особыми (и более привычными) случаями являются векторы (массивы 1d) и матрицы (массивы 2d).

Ниже приведено лишь введение в концепцию: индексная нотация используется более подробно в математике (в частности, в представлении и манипулировании тензорными операциями ). Более подробную информацию см. в основной статье.

Одномерные массивы (векторы)

Вектор, рассматриваемый как массив чисел, записанный как вектор-строка или вектор-столбец (в зависимости от того, какой вариант используется, зависит от удобства или контекста):

Индексная нотация позволяет указывать элементы массива, просто записывая a i , где известно, что индекс i изменяется от 1 до n из-за n-мерности. [1] Например, если задан вектор:

то некоторые записи

.

Обозначение может быть применено к векторам в математике и физике . Следующее векторное уравнение

также может быть записано в терминах элементов вектора (т.е. компонентов), то есть

где индексы принимают заданный диапазон значений. Это выражение представляет собой набор уравнений, по одному для каждого индекса. Если векторы имеют n элементов, то есть i = 1,2,… n , то уравнения явно

Таким образом, индексная нотация служит эффективным сокращением для

  1. представление общей структуры уравнения,
  2. применимо к отдельным компонентам.

Двумерные массивы

Элементы матрицы А описываются двумя нижними индексами.

Для описания массивов чисел в двух или более измерениях, таких как элементы матрицы, используется более одного индекса (см. также изображение справа);

Запись матрицы 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 .

Ссылки

  1. ^ Введение в тензорный анализ: для инженеров и прикладных ученых, JR Tyldesley, Longman, 1975, ISBN  0-582-44355-5
  2. ^ Программирование на C++, Дж. Хаббард, Schaum's Outlines, McGraw Hill (США), 1996, ISBN 0-07-114328-9