Notação de índice - Index notation

Em matemática e programação de computadores , a notação de índice é usada para especificar os elementos de uma matriz de números. O formalismo de como os índices são usados ​​varia de acordo com o assunto. Em particular, existem diferentes métodos para se referir aos elementos de uma lista, um vetor ou uma matriz, dependendo se alguém está escrevendo um artigo matemático formal para publicação ou quando está escrevendo um programa de computador .

Na matemática

É frequentemente útil em matemática referir-se aos elementos de um array usando subscritos. Os subscritos podem ser inteiros ou variáveis . O array assume a forma de tensores em geral, uma vez que podem ser tratados como arrays multidimensionais. Casos especiais (e mais familiares) são vetores (matrizes 1d) e matrizes ( matrizes 2d).

O que se segue é apenas uma introdução ao conceito: a notação de índice é usada com mais detalhes em matemática (particularmente na representação e manipulação de operações de tensores ). Veja o artigo principal para mais detalhes.

Matrizes unidimensionais (vetores)

Um vetor tratado como uma matriz de números, escrito como um vetor linha ou vetor coluna (o que for usado depende da conveniência ou do contexto):

A notação de índice permite a indicação dos elementos da matriz simplesmente escrevendo um i , onde o índice i é conhecido por ir de 1 a n , por causa de n-dimensões. Por exemplo, dado o vetor:

então algumas entradas são

.

A notação pode ser aplicada a vetores em matemática e física . A seguinte equação vetorial

também pode ser escrito em termos dos elementos do vetor (também conhecidos como componentes), ou seja,

onde os índices assumem um determinado intervalo de valores. Esta expressão representa um conjunto de equações, uma para cada índice. Se cada um dos vetores tiver n elementos, o que significa i = 1,2, ... n , então as equações são explicitamente

Portanto, a notação de índice serve como uma abreviatura eficiente para

  1. representando a estrutura geral para uma equação,
  2. embora aplicável a componentes individuais.

Matrizes bidimensionais

Os elementos da matriz A são descritos com dois índices ou índices.

Mais de um índice é usado para descrever matrizes de números, em duas ou mais dimensões, como os elementos de uma matriz, (veja também a imagem à direita);

A entrada de uma matriz A é escrita usando dois índices, digamos i e j , com ou sem vírgulas para separar os índices: a ij ou a i, j , onde o primeiro subscrito é o número da linha e o segundo é o número da coluna. A justaposição também é usada como notação para multiplicação; isso pode ser uma fonte de confusão. Por exemplo, se

então algumas entradas são

.

Por índices maiores do que 9, a notação à base de vírgula podem ser preferíveis (por exemplo, um 3,12 em vez de um 312 ).

As equações matriciais são escritas de forma semelhante às equações vetoriais, como

em termos dos elementos das matrizes (também conhecidos como componentes)

para todos os valores de i e j . Novamente, essa expressão representa um conjunto de equações, uma para cada índice. Se cada uma das matrizes tiver m linhas en colunas, o que significa i = 1, 2,…, m e j = 1, 2,…, n , então há mn equações.

Matrizes multidimensionais

A notação permite uma generalização clara para matrizes multidimensionais de elementos: tensores. Por exemplo,

representando um conjunto de muitas equações.

Na análise de tensores, sobrescritos são usados ​​em vez de subscritos para distinguir entidades covariantes de contravariantes, veja covariância e contravariância de vetores e índices de aumento e redução .

Em computação

Em várias linguagens de programação, a notação de índice é uma maneira de abordar os elementos de um array. Este método é usado porque é o mais próximo de como ele é implementado em linguagem assembly, em que o endereço do primeiro elemento é usado como base e um múltiplo (o índice) do tamanho do elemento é usado para endereçar dentro do array.

Por exemplo, se uma matriz de inteiros é armazenada em uma região da memória do computador começando na célula de memória com endereço 3000 (o endereço de base ), e cada inteiro ocupa quatro células (bytes), então os elementos desta matriz estão na memória localizações 0x3000, 0x3004, 0x3008,…, 0x3000 + 4 ( n - 1) (observe a numeração baseada em zero ). Em geral, o endereço do i ésimo elemento de uma matriz com endereço de base be tamanho de elemento s é b + is .

Detalhes de implementação

Na linguagem de programação C , podemos escrever o acima como *(base + i)(forma de ponteiro) ou base[i](forma de indexação de array), que é exatamente equivalente porque o padrão C define a forma de indexação de array como uma transformação para a forma de ponteiro. Coincidentemente, como a adição do ponteiro é comutativa, isso permite expressões obscuras como o 3[base]que é equivalente a base[3].

Matrizes multidimensionais

As coisas se tornam mais interessantes quando consideramos arrays com mais de um índice, por exemplo, uma tabela bidimensional. Temos três possibilidades:

  • tornar a matriz bidimensional unidimensional calculando um único índice das duas
  • considere uma matriz unidimensional onde cada elemento é outra matriz unidimensional, ou seja, uma matriz de matrizes
  • use armazenamento adicional para manter a matriz de endereços de cada linha da matriz original e armazene as linhas da matriz original como matrizes unidimensionais separadas

Em C, todos os três métodos podem ser usados. Quando o primeiro método é usado, o programador decide como os elementos do array são dispostos na memória do computador e fornece as fórmulas para calcular a localização de cada elemento. O segundo método é usado quando o número de elementos em cada linha é o mesmo e conhecido no momento em que o programa é escrito. O programador declara que o array tem, digamos, três colunas escrevendo, por exemplo elementtype tablename[][3];. Em seguida, refere-se a um elemento específico da matriz por escrito tablename[first index][second index]. O compilador calcula o número total de células de memória ocupadas por cada linha, usa o primeiro índice para encontrar o endereço da linha desejada e, em seguida, usa o segundo índice para encontrar o endereço do elemento desejado na linha. Quando o terceiro método é usado, o programador declara a tabela como um array de ponteiros, como em elementtype *tablename[];. Quando o programador especifica subsequentemente um elemento particular tablename[first index][second index], o compilador gera instruções para pesquisar o endereço da linha especificada pelo primeiro índice e usa esse endereço como base ao calcular o endereço do elemento especificado pelo segundo índice.

Exemplo

Esta função multiplica duas matrizes de ponto flutuante 3 × 3 juntas.

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

Em outras línguas

Em outras linguagens de programação, como Pascal, os índices podem começar em 1, então a indexação em um bloco de memória pode ser alterada para se ajustar a um esquema de endereçamento start-at-1 por uma transformação linear simples - neste esquema, a localização da memória do i o elemento com endereço de base be tamanho de elemento s é b + ( i - 1) s .

Referências

  • Programming with C ++ , J. Hubbard, Schaum's Outlines, McGraw Hill (EUA), 1996, ISBN  0-07-114328-9
  • Tensor Calculus , DC Kay, Schaum's Outlines, McGraw Hill (EUA), 1988, ISBN  0-07-033484-6
  • Métodos matemáticos para física e engenharia , KF Riley, MP Hobson, SJ Bence, Cambridge University Press, 2010, ISBN  978-0-521-86153-3