Anda di halaman 1dari 45

ICC901 – Introdução à Programação de Computadores

IEC081 – Introdução à Ciência dos Computadores


IEC037 – Introdução à Programação de Computadores

2016/2

Aula 07 – Matrizes
Atualização: 06/fev/2017

Fonte da imagem: https://www.codeschool.com/courses/forging-ahead-with-asp-net-core


Conteúdo

Introdução

Como criar uma matriz?

Como acessar elementos da matriz?

Aplicações de Álgebra Linear

2
Conteúdo

Introdução

Como criar uma matriz?

Como acessar elementos da matriz?

Aplicações de Álgebra Linear

3
Matrizes guardam dados
bidimensionais
Certos problemas
exigem que os dados
sejam organizados na
forma de matriz
bidimensional:
Temperatura medida em
diferentes localidades e em
diversos momentos.
Tempo de disparo de um
projétil e as respectivas
posições x e y no espaço.
Matrizes
:: Notação Matemática
Em notação matemática, em uma matriz A qualquer,
cada elemento é indicado por aij.
O índice i indica a linha.
O índice j indica a coluna.

𝑎11 𝑎12 ⋯ 𝑎1𝑛


𝑎21 𝑎22 ⋯ 𝑎2𝑛
𝐴𝑚×𝑛 = ⋮ ⋮ ⋱ ⋮
Nº de
linhas
Nº de
colunas
𝑎 𝑚1 𝑎𝑚2 ⋯ 𝑎𝑚𝑛
Matrizes em Python
Para operar com matrizes, utilize os módulos:
numpy – manipulação de vetores e matrizes,
numpy.linalg – operações de Álgebra Linear envolvendo
matrizes.

from numpy import *


from numpy.linalg import *

Mais detalhes:
docs.scipy.org/doc/numpy/reference/
6
Conteúdo

Introdução

Como criar uma matriz?

Como acessar elementos da matriz?

Aplicações de Álgebra Linear

7
Matrizes em Python
:: Declaração de matrizes
Cada linha da matriz é um vetor:
Os elementos de uma mesma linha devem ser
separados por vírgula e estar dentro de colchetes.

A matriz é um vetor de vetores:


Separe cada linha por vírgula.

A = array([[3, -4, 0], [5, 2, -1]])

Lembre-se de
importar a numpy 3 −4 0
𝐴=
5 2 −1
Como criar uma matriz?
:: Direto no script
Quadro de medalhas das
Olimpíadas de 2016: from numpy import *

quadro = array([
Ouro Prata Bronze [46, 37, 38],
EUA 46 37 38 [27, 23, 17],
Grã-Bretanha 27 23 17 [26, 18, 26],
[19, 18, 19],
China 26 18 26
[17, 10, 15],
Rússia 19 18 19 [12, 8, 21],
Alemanha 17 10 15 [10, 18, 14]
Japão 12 08 21 ])
França 10 18 14

9
Como criar uma matriz?
:: Via teclado
Os elementos de uma
mesma linha devem from numpy import *

ser separados por # Leitura da matriz 'quadro'


vírgula. quadro =
array(eval(input("Digite a
matriz: ")))
Cada linha da matriz
deve estar entre print(quadro)

colchetes.
As linhas devem ser
separadas por vírgula. [[3, -4, 0],
[5, 2, -1]]
Como criar uma matriz?
:: Zeros ou uns

from numpy import * from numpy import *

# Matriz 3x2 de ZEROS # Matriz 2x5 de UNS


m0 = zeros((3,2)) m1 = ones((2,5))

print(m0) print(m1)
Use os dois
conjuntos de
parênteses!

[[ 0. 0.] [[ 1. 1. 1. 1. 1.]
[ 0. 0.] [ 1. 1. 1. 1. 1.]]
[ 0. 0.]]
Conteúdo

Introdução

Como criar uma matriz?

Como acessar elementos da matriz?

Aplicações de Álgebra Linear

12
Como acessar elementos da matriz?

Índice da Índices das colunas


coluna
0 1 2

x = mat[3,1] 0

Índices das linhas


1
Índice da 2
linha
3
4
5
6
Quais as dimensões de uma matriz?

Número de elementos: Número de linhas:


TAM = size(quadro) LIN = shape(quadro)[0]
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙

Vetor com número de Número de colunas:


linhas e de colunas:
FORMA = shape(quadro) COL = shape(quadro)[1]
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
Problema 01
:: Soma de uma linha
Qual o total de medalhas Ouro Prata Bronze
EUA 46 37 38
da Rússia nas Olimpíadas
Grã-Bretanha 27 23 17
de 2016?
China 26 18 26
Rússia 19 18 19
Alemanha 17 10 15
Japão 12 08 21
França 10 18 14

15
Soma de uma linha
Qual a linha que corresponde às medalhas da Russia?
Linha 3 0 MEDALHAS-1

linha 3 [3,0] [3,1] [3,2]

16
Soma de uma linha
:: Script
# Constantes (facilitam manutencao)
PAISES = shape(quadro)[0]
MEDALHAS = shape(quadro)[1]

total = 0

# Processa a j-esima coluna na linha 4


for j in range(MEDALHAS): Gera índices de colunas
total = total + quadro[3,j]

print(total)
17
Problema 02
:: Soma de uma coluna
Qual o total de medalhas Ouro Prata Bronze
EUA 46 37 38
de ouro dos sete
Grã-Bretanha 27 23 17
primeiros colocados nas
China 26 18 26
Olimpíadas de 2016? Rússia 19 18 19
Alemanha 17 10 15
Japão 12 08 21
França 10 18 14

18
Soma de uma coluna
Qual o total de medalhas do tipo j entre os sete países?
coluna j

[0,j] 0
[1,j]

[2,j]

[3,j]

[4,j]

[5,j]

[6,j] PAISES - 1
Soma de uma coluna
:: Script
# Constantes (facilitam manutencao)
PAISES = shape(quadro)[0]
MEDALHAS = shape(quadro)[1]

ouro = 0

# Percorre a i-esima linha na coluna 0


for i in range(PAISES): Gera índices das linhas da matriz
ouro = ouro + quadro[i,0]

print(ouro)
Seleção de elementos

Seleção de todos os 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
elementos da linha i: 𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
x = quadro[i,:] 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙

Seleção de todos os 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
elementos da coluna j: 𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
x = quadro[:,j] 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙 𝒙
Problema 03
:: Soma de cada linha
Qual o total de medalhas Ouro Prata Bronze
de cada país? EUA 46 37 38
Grã-Bretanha 27 23 17
China 26 18 26
Rússia 19 18 19
Alemanha 17 10 15
Japão 12 08 21
França 10 18 14

22
Soma de uma coluna
:: Script
# Constantes (facilitam manutencao)
PAISES = shape(quadro)[0]

# Soma as medalhas ganhas para cada pais


for i in range(PAISES): Gera índices das linhas da matriz
total = sum(quadro[i,:])
print(total)
Localizando elementos adjacentes
Alguns programas que trabalham com matrizes precisam
localizar os elementos adjacentes a outro elemento
[i,j].

[i-1,j-1] [i-1,j] [i-1,j+1]

[i,j-1] [i,j] [i,j+1]


Cuidado para não
obter índices
negativos [i+1,j-1] [i+1,j] [i+1,j+1]
Problema 04
Escreva um script que imprima
uma matriz quadrada de
dimensão N contendo:
1 nos elementos abaixo da
diagonal principal
0 na diagonal principal
-1 nos elementos acima da
diagonal principal
Problema 04
:: Projetar algoritmo
coluna [j]
[0,0] [0,1] [0,2] [0,3]
[1,0] [1,1] [1,2] [1,3]
linha [i]
[2,0] [2,1] [2,2] [2,3]
[3,0] [3,1] [3,2] [3,3]

Diagonal principal: i = j
Elementos acima: i < j
Elementos abaixo: i > j
26
Problema 04
:: Script
from numpy import *

DIM = int(input("Dimensao da matriz: "))

# Cria matriz de zeros, no formato inteiro


mat = zeros((DIM,DIM), dtype=int)

# Preenchimento da matriz
for i in range(DIM):
for j in range(DIM):
# Verifica se termo estah ABAIXO
if (i > j):
mat[i,j] = 1
# Verifica se termo estah ACIMA
elif (i < j):
mat[i,j] = -1
# Elementos da diagonal principal
else:
mat[i,j] = 0
27
Problema 05
:: Qual a nota de cada aluno?
Oito estudantes responderam a um teste de dez
perguntas. As respostas são armazenadas em uma
matriz. Cada linha registra as respostas de um aluno para
as questões.
Problema 05 (cont.)
O gabarito é armazenado em um vetor de dez elementos.
Considerando que cada questão vale um ponto, qual a
nota de cada aluno?
Problema 05
:: Projetar algoritmo
1. Definir matriz de respostas (resp)
2. Definir vetor de gabarito (gab)
3. Definir um vetor de notas (notas), com número de
elementos igual ao número de linhas da matriz resp
4. Para cada aluno (linha) na matriz resp:
A. Para cada resposta (coluna) na matriz resp:
i. Comparar resposta do aluno com gabarito
ii. Se forem iguais, incrementar posição correspondente no vetor
notas
iii. Caso contrário, não faz nada
B. Imprimir nota do aluno
Problema 05
:: Script – definições
from numpy import *

# Respostas dos alunos aas questoes


resp = array ([
['A', 'B', 'A', 'C', 'C', 'D', 'E', 'E', 'A', 'D'],
['D', 'B', 'A', 'B', 'C', 'A', 'E', 'E', 'A', 'D'],
['E', 'D', 'D', 'A', 'C', 'B', 'E', 'E', 'A', 'D'],
['C', 'B', 'A', 'E', 'D', 'C', 'E', 'E', 'A', 'D'],
['A', 'B', 'D', 'C', 'C', 'D', 'E', 'E', 'A', 'D'],
['B', 'B', 'E', 'C', 'C', 'D', 'E', 'E', 'A', 'D'],
['B', 'B', 'A', 'C', 'C', 'D', 'E', 'E', 'A', 'D'],
['E', 'B', 'E', 'C', 'C', 'D', 'E', 'E', 'A', 'D']])

# Gabarito das questoes


gab = array(
['D', 'B', 'D', 'C', 'C', 'D', 'A', 'E', 'A', 'D'])
Problema 05
:: Script (cont.) – cálculo da nota
# Constantes
NALUNOS = shape(resp)[0] # No. de alunos
NQUEST = shape(resp)[1] # No. de questoes

# Vetor das notas de cada aluno


notas = zeros((NALUNOS), dtype=int)

# Percorre cada linha (aluno)


for i in range(NALUNOS):
# Pontua um aluno i, verificando cada questao
for j in range(NQUEST):
if (resp[i,j] == gab[j]):
notas[i] = notas[i] + 1

print("Nota do aluno", i, ":", notas[i])


Conteúdo

Introdução

Como criar uma matriz?

Como acessar elementos da matriz?

Aplicações de Álgebra Linear


Matrizes em Python
:: Operações

Estruturais Matriciais
• Operações • Seguem as
entre matrizes regras
executadas normais da
elemento a álgebra linear
elemento
Matrizes em Python
:: Operações estruturais e matriciais
Operação Em Python Comentários
Soma a + b Soma estrutural e soma matricial
são idênticas.
Subtração a – b Subtração estrutural e subtração
matricial são idênticas.
Multiplicação a * b Multiplicação elemento a
estrutural elemento de a e b. As duas
matrizes precisam ter as mesmas
dimensões.
Multiplicação dot(a,b) Multiplicação das matrizes a e b. O
matricial número de colunas em a precisa
ser igual ao de linhas em b.
Matrizes em Python
:: Operações

Operação Em Python Módulo


Transposta m.T numpy
Determinante det(m) linalg
Inversa inv(m) linalg
Problema 06
:: Matriz transposta
Leia uma matriz M×N a
partir do teclado.
Ache a transposta da
matriz fornecida.
Problema 06
:: Projetar algoritmo
[0,0] [0,1] [0,2]
[1,0] [1,1] [1,2]
Matriz mat
[2,0] [2,1] [2,2]
[3,0] [3,1] [3,2]

tp[i,j] = mat[j,i]
Matriz tp
a[0,0] a[1,0] a[2,0] a[3,0]
a[0,1] a[1,1] a[2,1] a[3,1]
a[0,2] a[1,2] a[2,2] a[3,2]

tp = mat.T
Problema 06
:: Script
from numpy import *

mat = array(eval(input("Matriz: ")))

# Impressao do resultado
print(mat.T)
Problema 07
:: Sistemas de Equações Lineares
Uma fabrica produz de três tipos de componentes: A, B e C.
Três tipos de matérias primas: metal, plástico e borracha.
As quantidades (em grama) de material exigido para produzir
cada componente são:
Componente Metal Plástico Borracha
A 1 1 2
B 1 2 1
C 2 1 1
Se houver disponíveis 900g, 800g e 700g de metal, plástico e
borracha, respectivamente, quantos componentes podem ser
produzidos?
Sistemas de Equações Lineares
:: Solução
1 ∙ 𝑎 + 1 ∙ 𝑏 + 2 ∙ 𝑐 = 900
1 ∙ 𝑎 + 2 ∙ 𝑏 + 1 ∙ 𝑐 = 800
2 ∙ 𝑎 + 1 ∙ 𝑏 + 1 ∙ 𝑐 = 700

1 1 2 𝑎 900
1 2 1 ∙ 𝑏 = 800
2 1 1 𝑐 700

𝐴∙𝑥 =𝐵

𝑥 = 𝐴−1 𝐵
Sistemas de Equações Lineares
:: Solução em Python
O módulo numpy.linalg deve ser usado para resolver
a equação:

𝑥 = 𝐴−1 𝐵

x = dot(inv(A), B)
Problema 07
:: Script
from numpy import *
from numpy.linalg import *

mat = array([[1,1,2], [1,2,1], [2,1,1]])


qtde = array([900, 800, 700])

# Resolucao do sistema de equacoes lineares


x = dot(inv(mat), qtde.T)

# Impressao do resultado
print(x)
Referências bibliográficas
Menezes, Nilo Ney Coutinho (2014). Introdução à
Programação com Python, 2 ed. Editora Novatec.
HETLAND, Magnus Lie (2008). Beginning Python: From
Novice to Professional. Springer eBooks, 2ª edição.
Disponível em: http://dx.doi.org/10.1007/978-1-4302-
0634-7.
Horstmann, Cay & Necaise, Rance D. (2013). Python for
Everyone. John Wiley & Sons.
Liang, Y. D. (2013). Introduction to Programming Using
Python. Pearson
Dúvidas?

Anda mungkin juga menyukai