Matrizes¶
Tópicos¶
Apelidos e clones de listas
Matrizes
Revisão de listas¶
O que é impresso pelo seguinte trecho de código:
Vejamos o código acima pela ótica do codelens:
No código acima b
é uma referência ou apelido (= alias) para a mesma lista a que a
está se referenciando.
O trecho de código a seguir cria um cópia (= clone) de a
e b
será uma referência a essa cópia.
Vejamos o que o codelens tem a dizer sobre o trecho de código acima.
A fatia a[:]
é uma cópia de a
, uma fatia com todos os elementos de a
.
Lembre-se que o :
é utilizado para definir uma fatia da lista.
Por exemplo, a[1:3]
produz a lista [1,2]
.
Criação de matrizes¶
Matrizes são estruturas bidimensionais (tabelas) com m
linhas por
n
colunas muito importantes na matemática, utilizadas por exemplo
para a resolução de sistemas de equações e transformações lineares.
Em Python, uma matriz pode ser representada como uma lista de listas, onde um elemento da lista contém uma linha da matriz, que por sua vez corresponde a uma lista com os elementos da coluna da matriz.
NumPy - Numerical Python
Dizem que, quando você usa Python, as baterias vem incluídas, pois há vários módulos a sua disposição. Um deles é o [NumPy](http://www.numpy.org/), que facilita operações com matrizes e torna o seu processamento mais eficaz. Mas usar matrizes como listas de listas é um recurso muito útil, inclusive para aprender mais sobre listas.
Qual o problema do seguinte pedaço de código para criação de uma
matriz A
com 5 linhas e 5 colunas com o valor 2 na posição [1][1]
e zero nas demais posições?
A variável linha_com_zeros
contém uma referência
à lista [0, 0, 0, 0, 0]
.
No trecho de código acima, na tentativa de cria uma matriz A
,
essa mesma referência é copiada 5 vezes. Assim, todas as linhas apontam para a mesma lista!
Para criarmos uma matriz é necessário criarmos 5 listas diferentes (uma para cada linha) como por exemplo:
Podemos ainda criar uma matriz de zeros utilizando uma função como
Veja a seguir uma versão errada da função crie_matriz()
.
Nessa versão cada linha da matriz é um apelido de uma mesma
lista.
Exercícios¶
Exercício 1¶
Escreva a função a leia_matriz()
a seguir.
Abaixo esta um exemplo com um passo a passo da execução da função.
>>> a = leia_matriz()
Digite o número de linhas: 3
Digite o número de colunas: 4
matriz = []
linha 0 = []
Digite o elemento (0,0): 1
linha 0 = [1]
Digite o elemento (0,1): 2
linha 0 = [1, 2]
Digite o elemento (0,2): 3
linha 0 = [1, 2, 3]
Digite o elemento (0,3): 4
linha 0 = [1, 2, 3, 4]
matriz = [[1, 2, 3, 4]]
linha 1 = []
Digite o elemento (1,0): 5
linha 1 = [5]
Digite o elemento (1,1): 6
linha 1 = [5, 6]
Digite o elemento (1,2): 7
linha 1 = [5, 6, 7]
Digite o elemento (1,3): 8
linha 1 = [5, 6, 7, 8]
matriz = [[1, 2, 3, 4], [5, 6, 7, 8]]
linha 2 = []
Digite o elemento (2,0): 9
linha 2 = [9]
Digite o elemento (2,1): 10
linha 2 = [9, 10]
Digite o elemento (2,2): 11
linha 2 = [9, 10, 11]
Digite o elemento (2,3): 12
linha 2 = [9, 10, 11, 12]
matriz = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
>>> a
Exercício 4¶
Escreva um programa que lê n
e uma matriz A
de inteiros
de dimensão n x n
, e verifica se A
é simétrica.
0 1 2 3
+-----+-----+-----+-----+
0 | 11 | -3 | 4 | 8 |
+-----+-----+-----+-----+
1 | -3 | 12 | 6 | 11 |
+-----+-----+-----+-----+
2 | 4 | 6 | 5 | 13 |
+-----+-----+-----+-----+
3 | 8 | 11 | 13 | 5 |
+-----+-----+-----+-----+
Sugestões: utilize as funções leia_matriz()
,
imprima_matriz()
e simetrica()
dos exercícios anteriores.
Exercício 5¶
Escreva um programa que leia inteiros positivos m
e n
e
os elementos de uma matriz A
de números inteiros de
dimensão m x n
e conta o número de linhas e colunas que tem apenas zeros.
Matriz: 4 x 5
0 0 0 0 1
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
Linhas nulas = 2
Colunas nulas = 3
Exercício 7¶
Escreva um programa que leia duas matrizes, a matriz A
de dimensão m x n
e B
de dimensão n x p
e
imprime a matriz C
de dimensão m x p
que é
o produto de A
por B
.
Sugestões: utilize as funções leia_matriz()
,
imprima_matriz()
e multiplica_matriz()
dos exercícios anteriores.
Exercício 8¶
Nesse exercício, vamos continuar a explorar a multiplicação de matrizes, mas dessa vez explorando o coneito de produto escalar de duas listas, que correspondem a uma linha e uma coluna das matrizes multiplicadas.
Parte A
Escreva uma função que recebe um inteiro lin
e uma matriz real A
e
outro inteiro col
e uma matriz real B
,
e calcula a soma do produto entre os elementos da linha
lin
de A
e com os respectivos elementos da coluna col
de B
.
Você deve considerar que o número de colunas de A
é o mesmo número
de linhas de B
.
Parte B
Utilizando a função do item anterior, escreva um programa que
leia duas matrizes, a matriz A
de dimensão m x n
e B
de dimensão n x p
e imprime a matriz C
de dimensão m x
p
que é o produto de A
por B
.
Exercício 9¶
Parte A
Escreva uma função MAX
que recebe como entrada
uma matriz inteira A
e devolve três inteiros:
k
, lin
e col
. O inteiro k
é um maior elemento de
A
e é igual a A[lin,col]
.
Exemplo:
A = [ [3, 7, 1], [1, 2, 8], [5, 3, 4]]
a função deve devolver
8, 1, 2
Obs.: Se o elemento máximo ocorrer mais de uma vez, indique em lin
e
col
qualquer uma das possíveis posições.
Parte B
Escreva um programa que, dado dois inteiros nl
e nc
e uma
matriz quadrada de dimensão nl x nc
, cujos elementos são todos
inteiros, imprime uma tabela onde os elementos são listados
em ordem decrescente, acompanhados da indicação de linha e coluna a
que pertencem. Havendo repetições de elementos na matriz, a ordem é
irrelevante. Utilize obrigatoriamente o procedimento da parte A,
mesmo que você não o tenha feito.
Ex.: No caso da matriz acima, a saída poderia ser:
Elem Linha Coluna
8 1 2
7 0 1
5 2 0
4 2 2
3 0 0
3 2 1
2 1 1
1 0 2
1 1 0
Exercício 10¶
Campo Minado é um jogo que se tornou muito popular por acompanhar o sistema operacional Microsoft Windows.
Nesse jogo, o campo minado pode ser representado por uma matriz retangular. O jogador deve revelar todas as posições livres (sem bomba) da matriz, clicando em uma posição com conteúdo desconhecido. O jogo acaba quando o jogador clicar em uma posição com bomba, ou quando todas as posições livres forem abertas.
Nesse exercício, você deve implementar algumas funções que podem ser utilizadas na implementação desse jogo.
Parte A
Escreva uma função que recebe como parâmetros uma matriz inteira A
e uma posição (lin, col) da matriz, e conta quantas posições ao redor
da posição (lin, col) contém o valor -1 (valor adotado para
representar uma bomba)
Uso de constantes
O uso de constantes é uma boa prática de programação. No caso do campo minado, ao invés de utilizar o valor -1, podemos criar uma constante (variável que nunca muda de valor após criada) chamada BOMBA com o valor -1.
Parte B
Escreva um programa que lê uma matriz A de 0’s (posições livres) e -1’s (bomba). Utilizando a função do item anterior, o programa deve computar e imprimir a quantidade de bombas ao redor de cada posição livre da matriz.