В математике и компьютерном программировании , индекс обозначения используется для указания элементов массива чисел. Формализм использования индексов зависит от предмета. В частности, существуют разные методы обращения к элементам списка, вектора или матрицы, в зависимости от того, пишут ли вы формальную математическую статью для публикации или когда пишете компьютерную программу .
По математике [ править ]
В математике часто бывает полезно ссылаться на элементы массива с помощью индексов. Индексы могут быть целыми числами или переменными . В общем случае массив принимает форму тензоров , поскольку их можно рассматривать как многомерные массивы. Особыми (и более известными) случаями являются векторы (1d массивы) и матрицы (2d массивы).
Следующее - только введение в концепцию: индексная нотация используется более подробно в математике (особенно в представлении и управлении тензорными операциями ). См. Основную статью для получения дополнительной информации.
Одномерные массивы (векторы) [ править ]
Вектор, рассматриваемый как массив чисел, записывается как вектор-строка или вектор-столбец (в зависимости от того, что используется, зависит от удобства или контекста):
Индекс обозначение позволяет индикацию элементов массива путем простого написания в I , где индекс я известен для запуска от 1 до п , из п-размеров. [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]
, компилятор генерирует инструкции для поиска адреса строки, указанной первым индексом, и использования этого адреса в качестве основы при вычислении адреса элемента, указанного вторым индексом.
Пример [ править ]
Эта функция умножает две матрицы 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 ) { результат[ i ] [ j ] = 0 ; для ( k = 0 ; k < 3 ; ++ k ) результат [ i ] [ j ] + = A [ i ] [ k ] * B [ k ] [ j ]; } } }
На других языках [ править ]
В других языках программирования, таких как Pascal, индексы могут начинаться с 1, поэтому индексирование в блоке памяти может быть изменено для соответствия схеме адресации start-at-1 с помощью простого линейного преобразования - в этой схеме расположение в памяти i -й элемент с базовым адресом b и размером элемента s равен b + ( i - 1) s .
Ссылки [ править ]
- ^ Введение в тензорный анализ: для инженеров и ученых-прикладников, JR Tyldesley, Longman, 1975, ISBN 0-582-44355-5
- ^ Programming with C ++, J. Hubbard, Schaum's Outlines, McGraw Hill (США), 1996, ISBN 0-07-114328-9
- Программирование с C ++ , Дж. Хаббард, Schaum's Outlines, McGraw Hill (США), 1996, ISBN 0-07-114328-9
- Тензорное исчисление , DC Kay, Schaum's Outlines, McGraw Hill (США), 1988, ISBN 0-07-033484-6
- Математические методы для физики и инженерии , KF Riley, MP Hobson, SJ Bence, Cambridge University Press, 2010, ISBN 978-0-521-86153-3