Vetores e matrizes

From Applied Science
Revision as of 22:17, 20 January 2025 by Wikiadmin (talk | contribs) (Created page with "''Em inglês, vetor é array. A tradução não é vector. Em C uma matriz é uma matriz para o usuário e para o programador que não está lidando com aritmética de ponteiros, mas quando se lida com a aritmética de ponteiros, uma matriz passa a ser um vetor de vetor ou "array of array" em inglês.'' Na disciplina de introdução você inicialmente aprende pra que serve vetor e como usar um. A parte mais matemática do assunto, teoremas matemáticos e propriedades es...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Em inglês, vetor é array. A tradução não é vector. Em C uma matriz é uma matriz para o usuário e para o programador que não está lidando com aritmética de ponteiros, mas quando se lida com a aritmética de ponteiros, uma matriz passa a ser um vetor de vetor ou "array of array" em inglês.

Na disciplina de introdução você inicialmente aprende pra que serve vetor e como usar um. A parte mais matemática do assunto, teoremas matemáticos e propriedades específicas não é estudada. Isso é deixado pra ser aprofundado com Álgebra Linear. No começo você pode encarar vetor e matriz como uma espécie de variável que guarda um conjunto de valores, mas é errado chamar vetor e matriz de variável. Fica mais claro depois que você aprende ponteiros, mas até lá dá pra fazer o básico de vetores e matrizes sem pensar nos ponteiros. Por enquanto, vetor como uma sequência ordenada e matriz como matriz mesmo, aquela do ensino médio, é suficiente.

Todos os problemas são "resolvíveis" com vetores ou matrizes de dimensão fixa, dimensão variável precisa usar alocação dinâmica de memória e isso não faz parte da introdução.

A lógica básica é: você usa um laço e um contador. Todo vetor ou matriz tem um índice, as posições dos elementos no conjunto, a ideia é ter um laço e um contador que represente a sequência de posições do vetor ou da matriz.

Erros de lógica:

  • O principal é com o índice. Se o contador indicar índice fora da dimensão máxima ou mínima, "run to the hills";
  • O menos grave é você errar na contagem, grava ou lê alguma coisa na posição errada, por cima de outra;
  • No começo é comum se confundir com o índice, a posição, e o elemento guardado ali propriamente dito.


É preciso entender bem os laços de repetição para entender como operar com vetores e matrizes


  • Preencher um vetor / matriz com um monte de números:
int vetor[max], i;
/* todos os índices, 0 ... max - 1, do vetor recebem o valor 1 */
for (i = 0; i < max; i++) {
     vetor[i] = 1;
}

Com matriz a lógica é a mesma:

int matriz[imax][jmax], i, j;

/* preenche todos os índices da matriz com o valor 7. Linha por linha, coluna por coluna */ 
for (i = 0; i < imax; i++)
     for (j = 0; j < jmax; j++)
          matriz[i][j] = 7;

Para n dimensões, serão n laços em cascata, o que é extremamente lento por sinal. O laço mais interno de todos estará variando o índice da última dimensão da matriz (o colchete mais a direita na declaração). O laço mais externo o índice mais a esquerda.

Percorrer linhas primeiro ou colunas primeiro? Apenas por questões como leitura do código e indentação, utilizar o padrão que é linhas primeiro, colunas depois, laço externo conta linhas, laço interno conta colunas, facilita as coisas, embora não seja proibido inverter essa ordem.


  • União de conjuntos, união de dois vetores:
int a[max], b[max], c[max];
int i, j, k = 0;
/* k conta quantos elementos tem c[] e tambem indica 
   o índice de c[], para não copiar nenhum elemento 
   de b[] onde já havia um elemento de a[] antes */

/* copie todos os elementos de a[] em c[] */
for (i = 0; i < max; i++)
     c[k++] = a[i];

/* compare todos os elementos de b[] com todos de c[] 
   Interrompa a comparação no primeiro elemento de b[] 
   igual a um de c[]. Se a comparação não foi interrompida, 
   então copie o elemento corrente de b[] em c[] */
for (i = 0; i < max; i++) {
     for (j = 0; j < k; j++)
          if (c[j] == b[i]) break;
        
     if (j == k)
         c[k++] = b[i];
}

O algoritmo só funciona corretamente se tanto 'a' quanto 'b' não tiverem nenhum elemento repetido. Como exercício, tente resolver o problema quando há elementos repetidos. Tente também fazer a diferença de conjuntos.


  • Álgebra linear, multiplicação de matriz por vetor:
int i, j, linhas, colunas;
int c[imax], a[imax][jmax], b[jmax];

/* multiplique matriz por vetor, elemento a elemento. 
   c[i] = 0 é obrigatório, caso contrário o produto da 
   linha anterior é acumulado na seguinte */
for (i = 0; i < linhas; i++) {
     c[i] = 0;
     for (j = 0; j < colunas; j++)
          c[i] += a[i][j] * b[j];
}

Um pequeno detalhe que pode confundir: um vetor, em matemática, é representado como uma matriz com uma coluna e número de linhas igual ao número de colunas da matriz. Mas no computador, o vetor é representado por um índice apenas, não é utilizada uma matriz de uma coluna só.

Se não se lembrar de como se multiplica matriz por vetor, consulte um livro didático ou site que contenha a regra da multiplicação de matrizes. Lembre-se que o produto matriz por vetor sempre resulta num vetor.