Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

По математике [ править ]

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

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

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

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

Индекс обозначение позволяет индикацию элементов массива путем простого написания в I , где индекс я известен для запуска от 1 до п , из п-размеров. [1] Например, для вектора:

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

.

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

также можно записать в терминах элементов вектора (иначе говоря, компонентов), то есть

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

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

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

Двумерные массивы [ править ]

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

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

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

Ссылки [ править ]

  1. ^ Введение в тензорный анализ: для инженеров и ученых-прикладников, JR Tyldesley, Longman, 1975, ISBN  0-582-44355-5
  2. ^ 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 

Внешние ссылки [ править ]