Introdução às matrizes
Nesta seção examinaremos resumidamente como utilizar matrizes tanto em C quanto em Python.
Da mesma forma que o conceito de vetor é útil quando necessita-se de uma grande quantidade de valores associados, todos eles, a um mesmo tipo de dado (como as várias notas de determinado aluno), o conceito de matriz é útil quando naturalmente os dados considerados apresentam duas dimensões. Um exemplo é quando precisamos processar dados de um grupo de indivíduos (e.g. alunos), cada um deles com várias medidas (e.g. notas - vide figura 1).
Também vale a pena destacar que, tanto em C quanto em Python, a implementação de matriz é feita por meio de vetor de vetores. Desse modelo, em ambas pode-se tratar cada linha como um vetor. Por exemplo, se a matriz recebe o nome de M, então M[0] é sua primeira linha, M[1] a segunda linha e assim por diante. Se for necessário pegar um elemento específico da matriz, deve-se usar dois colcetes, como em M[i][j], que devolve o valor da linha i na coluna j (e.g. M[0][0] devolve o valor da primeira posição da matriz e M[1][0] devolve o valor do primeiro elemento sua segunda linha).
Matrizes: sequência contígua de variáveis
Do ponto de vista computacional a implementação de matrizes segue o princípio dos vetores, uma matriz ocupa uma porção contígua da memória do computador, servindo para representar o conceito matemático associado. Lembrando que ao representar um vetor o acesso ao elemento da posição i pode ser feito por meio da sintaxe vet[i], no caso de matriz é necessário indicar em qual linha i e em qual coluna j o elemento está, por exemplo, se a variável tem por nome Mat, usaria Mat[i][j].
Este tipo de estrutura de dados é natural quando os dados apresentam 2 atributos. Por exemplo, em uma sala de aula, o professor precisa manter informações dos resultados obtidos pelos alunos em várias atividades, assim pode-se utilizar uma matriz para representar estes dados: as atividades de cada aluno estão em uma única linha da matriz Mat (e.g., Mat[i][0] é o resultado da atividade 0 para o aluno i).
Mas como é possível implementar computacionalmente esse tipo de estrutura? Na figura acima está representado uma matriz conceitual, com a ideia de alunos e notas, e à direita como estes dados estão na memória do computador, supondo-se M+1 alunos e N+1 atividades. Se na representação computacional, o nome da matriz for Mat, então os dados correspondentes ao aluno 0 são: Mat[0][1], Mat[0][1] e assim por diante até o Mat[0][N].
Matrizes: como parâmetro de função
Do mesmo modo que vetores, ao passar uma matriz como parâmetro de uma função, este funcionará como parâmetro por referência (ou por endereço). Ou seja, é passada uma referência ao parâmetro efetivo (em que chamou a função) de modo que qualquer alteração dentro da função, no parâmetro formal, significará que o valor na matriz que foi passada como parämetro (no local que chamou a função e portanto o parâmetro efetivo) será alterado.
Tanto em C quanto em Python as matrizes (e vetores) são passados por referência. O exemplo abaixo ilustra que alterar os dados de uma matriz dentro de uma função implica em alterar a matriz que lhe foi passada (parâmetro efetivo).
Função com computa soma de 2 matrizes em C e em Python | ||
---|---|---|
Exemplo em C | Exemplo em Python | |
|
|
Matrizes: uma linha equivale a um vetor
Uma vez que os elementos em uma linha da matriz estão em posições contíguas da memória, eles podem ser olhados como um vetor, novamente o contexto determina o significado dos dados. Assim, se tivermos uma função soma_vetor que recebe como parâmetro um vetor (e sua dimensão) e que gera a soma de seus elementos, pode-se fazer a seguinte chamada: soma_vetor(mat[i],n), para qualquer i entre 0 e M do exemplo acima.
Desse modo, o exemplo abaixo ilustra uma função preparada para somar elementos de um vetor (soma += vet[i];) sendo usada para somar as linhas de uma matriz. Então, na execução do laço dentro função, o comando usando o parâmetro formal soma, soma += vet[i] equivalerá ao código soma += mat[k][i]; no trecho que invocou a função soma_vetor.
Função de função para somar elementos de vetor sendo usado com linhas de matrizes em C e em Python | ||
---|---|---|
Exemplo em C | Exemplo em Python | |
|
|
Diferença entre linguagem compilada (C) e linguagem interpretada (Python)
Uma grande diferença entre as linguagens C e Python é que a primeira é compilada enquanto a segunda é interpretada.
Uma linguagem compilada (como C) implica na existência de um programa (compilador) que traduz o texto do programa na linguagem referida, gerando um código equivalente em linguagem de máquina. Desse modo, existem dois momentos muito distintos, o tempo da compilação e o tempo da execução. Além disso, é preciso que cada "máquina" (que significa o computador/CPU e o sistema operacional - como o Linux) tenha o compilador para aquela linguagem. Isso funciona como se traduzir um texto de uma lingua (como Inglês) para outra (como o Português)
Em uma linguagem interpretada (como Python), existe um programa executável (para a máquina específica em que roda), que é o interpretador para a linguagem específica (e.g. Python). Assim, a tradução e a execução é feita praticamente ao mesmo tempo, como em uma tradução simultänea de uma conferência em Inglës para o Português.
Outra diferença grande entre C e Python é que a primeira é muito mais "estável", sua definição não sofre
alterações há anos, enquanto a segunda está em constante mudança.
Por outro lado, os interpretadores Python, em geral, apresentam uma vasta gama de pacotes integrados,
trazendo muitos recursos préviamente programadas, facilitando a "vida do programador"
(e dificultando a dos professores que precisam ficar vetando recursos para poder fazer os aprendizes entenderem que
tudo foi programada e poderem entender como o básico...).
Um bom exemplo são os pacotes para tratamento do protocolo HTTP.
Existem também para C pacotes livres para fazer implementações para serviços Web (usando HTTP), mas
geralmente eles não estão integrados aos compiladores.
Matrizes em C
Como em C deve-se sempre declarar o tipo da variável, no caso de matriz deve-se declarar seu tipo e seu tamanho. No exemplo abaixo ilustramos as declarações e uso de matrizes dos tipos básicos int, char e float.
Matrizes em C | |||
---|---|---|---|
Matriz de inteiros | Matriz de caracteres | Matriz de flutuantes | |
|
|
|
No C padrão NÃO é possível declarar as dimensões da matriz usando a variável que será usada para informar o número efetivo de posições "úteis" na matriz, ou seja, não tente fazer algo como: int m, n; float mat[m][n];. A razão disso é que C, por ser uma linguagem compilada, durante a fase de compilação deve-se reservar o espaço máximo a ser usado pelo matriz. Já as variáveis m e n só serão conhecidas durante a execução do programa.
Apesar de algumas implementações de compiladores C permitirem esse tipo de declarção "dinâmica", NÃO usem sob pena de seu programa não funcionar em outros compiladores.
Vejamos o exemplo da função soma_vetor sendo chamada com cada linha de uma matriz, com código completo em C.
// Exemplo de matriz em Python passando linha em funcao que trabalha com vetor #include <stdio.h>#define MAXL 20// usar no maximo 20 linhas #define MAXC 20// usar no maximo 20 colunas int soma_vet (int vet[],int n) {int soma = 0, i;for (i=0; i<n; i++) soma += vet[i]; return soma; }int main (void) {int mat[MAXL][MAXC];// declara que existira uma matriz (vetor de vetor) int i, j, m = 3, n = 4;// dimensoes fixas por simplicidade for (i=0; i<m; i++) {for (j=0; j<n; j++) { mat[i][j] = i*n + j;// como ja' existe espaco reservado atribua "i*m + j" para a posicao linha i e coluna j printf (" %3d", mat[i][j]);// imprime sem mudar de linha }printf ("\n");// muda de linha }printf ("Imprime somas das linhas\n");for (i=0; i<m; i++)printf ("Linha %d tem soma: %3d\n", i, soma_vet(mat[i], n));// %3d ajusta 3 casas 'a direita return 1; }
Matrizes em Python
Em Python pode-se gerar listas de variadas maneiras, a forma sugerida abaixo é gerar uma lista de listas, sendo que a segunda lista será uma linha da matriz. No código abaixo ilustramos isso.
A linha de uma matriz é na verdade um vetor
O exemplo abaixo ilustra a declaração e uso de matrizes, ccom os tipos básicos int, char e float.
Matrizes em Python | |||
---|---|---|---|
Matriz de inteiros | Matriz de caracteres | Matriz de flutuantes | |
|
|
|
No segundo exemplo acima, utilizamos recurso da biblioteca print_function, assim no Python 2 é obrigatório incluir esta biblioteca, como indicado nas primeiras linhas do exemplo abaixo. No caso do Python 3 a inclusão é desnecessária.
O exemplo abaixo ilustra outro conceito importante: cada linha da matriz comporta-se como lista e portanto pode-se aplicar sobre cada linha da matriz, qualquer função que tenha como parâmetro formal uma lista. O exemplo será aquele da função soma_vetor, que soma os elementos de um vetor.
# Exemplo de matriz em Python passando linha em funcao que trabalha com vetor # Python2 para 'print' sem pular linha : print("*" , end = ""); from __future__ import print_functiondef soma_vet (vet, n) : soma = 0;for i in range(0,n) : soma += vet[i]; return soma; mat = [];# declara que existira uma "lista" (que sera' lista de lista - ou vetor de vetor) m = 3; n = 4;# dimensoes fixas por simplicidade for i in range(0,m) : linha = [];# declara um "lista" (ou vetor) que sera' um linha da matriz 'mat[][]' for j in range(0,n) : linha.append(i*n + j);# equivale a fazer "mat[i][j] = i*m + j" (mas assim resulta erro em Python) # imprime sem mudar de linha # muda de linha mat.append(linha);# define a linha i da matriz (algo como mat[i] = linha) for i in range(0,m) :# %3d ajusta 3 casas 'a direita
Muita atenção ao método usado para construir a matriz, usando uma lista auxiliar linha e a necessidade de anexar cada linha separadamente (mat.append(linha);. Se isso não está suficientemente claro, sugiro que peguem este exemplo e "brinquem" com ele, até entendê-lo bem.
Bem, em resumo é isso.
Leônidas de Oliveira Brandão
http://line.ime.usp.br
Alterações:
2020/08/15: novo formato, pequenas revisões
2020/05/18: inserido um código Python explicando como criar matrizes.
2019/06/06: vários pequenos acertos ao longo do texto.