Notacja indeksu - Index notation

W matematyki i programowania komputerowego , notacja wskaźnik jest używany do określenia elementów tablicy liczb. Formalizm wykorzystania indeksów różni się w zależności od tematu. W szczególności istnieją różne metody odwoływania się do elementów listy, wektora lub macierzy, w zależności od tego, czy piszemy formalną pracę matematyczną do publikacji, czy też piszemy program komputerowy .

W matematyce

W matematyce często pomocne jest odwoływanie się do elementów tablicy za pomocą indeksów dolnych. Indeksy mogą być liczbami całkowitymi lub zmiennymi . Tablica przyjmuje ogólnie postać tensorów , ponieważ można je traktować jako tablice wielowymiarowe. Szczególnymi (i bardziej znanymi) przypadkami są wektory (macierze 1d) i macierze ( macierze 2d).

Poniżej znajduje się jedynie wprowadzenie do pojęcia: notacja indeksowa jest stosowana bardziej szczegółowo w matematyce (zwłaszcza w przedstawianiu i manipulowaniu operacjami tensorowymi ). Więcej informacji znajdziesz w głównym artykule.

Tablice jednowymiarowe (wektory)

Wektor traktowany jako tablica liczb przez zapisanie jako wektor wierszowy lub wektor kolumnowy (w zależności od tego, który z nich zostanie użyty, zależy od wygody lub kontekstu):

Notacja indeksowa pozwala na wskazanie elementów tablicy przez proste napisanie a i , gdzie indeks i jest znany jako biegnący od 1 do n , z powodu n-wymiarów. Na przykład, biorąc pod uwagę wektor:

to niektóre wpisy są

.

Notację można zastosować do wektorów w matematyce i fizyce . Następujące równanie wektorowe

można również zapisać w kategoriach elementów wektora (inaczej składowych), czyli

gdzie indeksy przyjmują określony zakres wartości. To wyrażenie reprezentuje zestaw równań, po jednym dla każdego indeksu. Jeśli każdy z wektorów ma n elementów, co oznacza i = 1,2,… n , to równania są jawnie

W związku z tym notacja indeksowa służy jako skuteczny skrót dla

  1. przedstawienie ogólnej struktury do równania,
  2. podczas gdy ma zastosowanie do poszczególnych komponentów.

Tablice dwuwymiarowe

Image
Elementy macierzy A opisane są dwoma dolnymi indeksami lub indeksami.

Do opisu tablic liczb w dwóch lub więcej wymiarach, takich jak elementy macierzy, używany jest więcej niż jeden indeks (patrz także obrazek po prawej);

Wpis macierzy A jest zapisany przy użyciu dwóch indeksów, powiedzmy i i j , z przecinkami lub bez, aby oddzielić indeksy: a ij lub a i,j , gdzie pierwszy indeks dolny to numer wiersza, a drugi to numer kolumny. Zestawienie jest również używane jako notacja do mnożenia; może to być źródłem zamieszania. Na przykład, jeśli

to niektóre wpisy są

.

Indeksy większe niż 9, oznaczenie przecinek oparte może być korzystne (np 3,12 zamiast 312 ).

Równania macierzowe są pisane podobnie do równań wektorowych, takich jak

pod względem elementów matryc (czyli komponentów)

dla wszystkich wartości i oraz j . Znowu to wyrażenie reprezentuje zestaw równań, po jednym dla każdego indeksu. Jeśli macierze mają po m wierszy i n kolumn, co oznacza, i = 1, 2, ..., m i j = 1, 2, ..., N , następnie są MN równań.

Tablice wielowymiarowe

Notacja pozwala na wyraźne uogólnienie na wielowymiarowe tablice elementów: tensory. Na przykład,

reprezentujący zbiór wielu równań.

W analizie tensorowej indeksy górne są używane zamiast indeksów dolnych, aby odróżnić byty kowariantne od kontrawariantnych, patrz kowariancja i kontrawariancja wektorów oraz indeksy podnoszące i obniżające .

W informatyce

W kilku językach programowania notacja indeksowa jest sposobem adresowania elementów tablicy. Ta metoda jest używana, ponieważ jest najbliższa temu, jak jest zaimplementowana w języku asemblerowym, gdzie adres pierwszego elementu jest używany jako podstawa, a wielokrotność (indeks) rozmiaru elementu jest używana do adresowania wewnątrz tablicy.

Na przykład, jeśli tablica liczb całkowitych jest przechowywana w regionie pamięci komputera zaczynając od komórki pamięci o adresie 3000 ( adres bazowy ), a każda liczba całkowita zajmuje cztery komórki (bajty), to elementy tej tablicy znajdują się w pamięci lokalizacje 0x3000, 0x3004, 0x3008, …, 0x3000 + 4( n − 1) (zwróć uwagę na numerację od zera ). Ogólnie adres i- tego elementu tablicy o adresie bazowym b i rozmiarze elementu s to b + is .

Szczegóły dotyczące wdrożenia

W języku programowania C możemy zapisać powyższe jako *(base + i)(forma wskaźnika) lub base[i](forma indeksowania tablicy), co jest dokładnie równoważne, ponieważ standard C definiuje formę indeksowania tablicy jako transformację do formy wskaźnika. Przypadkowo, ponieważ dodawanie wskaźnika jest przemienne, pozwala to na niejasne wyrażenia, takie jak 3[base]równoważne z base[3].

Tablice wielowymiarowe

Sprawy stają się ciekawsze, gdy weźmiemy pod uwagę tablice z więcej niż jednym indeksem, na przykład dwuwymiarową tabelę. Mamy trzy możliwości:

  • uczynić dwuwymiarową tablicę jednowymiarową, obliczając pojedynczy indeks z dwóch
  • rozważ tablicę jednowymiarową, w której każdy element jest inną tablicą jednowymiarową, tj. tablicą tablic
  • użyj dodatkowej pamięci do przechowywania tablicy adresów każdego wiersza oryginalnej tablicy i przechowuj wiersze oryginalnej tablicy jako oddzielne tablice jednowymiarowe

W C można zastosować wszystkie trzy metody. Kiedy używana jest pierwsza metoda, programista decyduje o tym, jak elementy tablicy są rozmieszczone w pamięci komputera i dostarcza formuły do ​​obliczenia położenia każdego elementu. Druga metoda jest stosowana, gdy liczba elementów w każdym wierszu jest taka sama i znana w momencie pisania programu. Programista deklaruje, że tablica ma, powiedzmy, trzy kolumny, pisząc np elementtype tablename[][3];. . Następnie odwołujemy się do konkretnego elementu tablicy, pisząc tablename[first index][second index]. Kompilator oblicza całkowitą liczbę komórek pamięci zajmowanych przez każdy wiersz, używa pierwszego indeksu do znalezienia adresu żądanego wiersza, a następnie używa drugiego indeksu do znalezienia adresu żądanego elementu w wierszu. Kiedy używana jest trzecia metoda, programista deklaruje tablicę jako tablicę wskaźników, tak jak w elementtype *tablename[];. Gdy programista następnie określa konkretny element tablename[first index][second index], kompilator generuje instrukcje wyszukiwania adresu wiersza określonego przez pierwszy indeks i używa tego adresu jako podstawy podczas obliczania adresu elementu określonego przez drugi indeks.

Przykład

Ta funkcja mnoży przez siebie dwie macierze zmiennoprzecinkowe 3×3.

 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];
     }
   }
 }

W innych językach

W innych językach programowania, takich jak Pascal, indeksy mogą zaczynać się od 1, więc indeksowanie w bloku pamięci można zmienić, aby dopasować się do schematu adresowania start-at-1 przez prostą transformację liniową – w tym schemacie lokalizacja pamięci i -ty element o adresie bazowym b i rozmiarze elementu s to b + ( i − 1) s .

Bibliografia

  • Programowanie w C++ , J. Hubbard, zarysy Schauma, McGraw Hill (USA), 1996, ISBN  0-07-114328-9
  • Rachunek tensorowy , DC Kay, zarysy Schauma , McGraw Hill (USA), 1988, ISBN  0-07-033484-6
  • Metody matematyczne dla fizyki i inżynierii , KF Riley, MP Hobson, SJ Bence, Cambridge University Press, 2010, ISBN  978-0-521-86153-3