Escreva funções que calculam as seguintes operações sobre matrizes quadradas com dimensão
:
- adição de duas matrizes;
- subtração de duas matrizes;
- transposta de uma matriz e
- multiplicação de duas matrizes.
Passo 1
O enunciado pede que sejam escritas funções que realizem quatro operações sobre matrizes quadradas de dimensão
:
- adição de duas matrizes;
- subtração de duas matrizes;
- transposta de uma matriz;
- multiplicação de duas matrizes.
Informações relevantes dadas:
- Todas as matrizes têm dimensão
(ou seja, 10 linhas e 10 colunas). - Deve-se retornar como resultado outra matriz
. - Não foi especificada linguagem, então será usada uma implementação prática e comum (Python) na resposta final.
Passo 2
O que significa cada operação — definição matemática bem mastigada (para entender antes de codificar):
- Adição elemento a elemento: se
e são matrizes , a matriz soma tem entradas
para todo
e
.
Explicação: pega-se a mesma posição em e
e soma-se. É uma conta bem direta.
Explicação: pega-se a mesma posição em
- Subtração elemento a elemento: similar à soma,
para todo
. Novamente, operação por posição.
- Transposta: a transposta de
, denotada , troca linhas por colunas:
ou seja, a linha
vira a coluna
. Se
tem entrada
, então
terá essa entrada em
.
- Multiplicação de matrizes: produto
com e é definido por
para todo
. Explicação passo a passo: para computar a entrada na linha
e coluna
do produto, multiplica-se cada elemento da linha
de
pelo correspondente elemento da coluna
de
e soma-se tudo.
Vou ilustrar a multiplicação com um exemplo miniatura (para entender a mecânica): se
e
fossem
,
então
e assim por diante.
Passo 3
Como representar a matriz na prática (dicas para a prova e para implementar):
- Uma forma simples é representar uma matriz como “lista de listas”: cada linha é uma lista com 10 elementos, e a matriz é uma lista com 10 dessas linhas.
- Índices em notação matemática vão de
a , mas em implementações (por exemplo Python) os índices começam em . Assim, a entrada em matemática corresponde a A[i-1][j-1] em Python. Para evitar confusão na prova, saiba traduzir índices. - Antes de operar, sempre cheque que ambas matrizes têm 10 linhas e cada linha tem 10 colunas — isso evita erro de shape.
Passo 4
Algoritmos (explicados para poder fazer no papel se necessário):
-
Adição e subtração: percorrer todas as posições
e aplicar a operação. Em pseudo-passo: - Para
até : - Para
até : - Calcule
.
- Para
-
Transposta:
- Para
até : - Para
até : - Coloque em
o valor .
- Para
-
Multiplicação (modo direto, que dá para aplicar na prova):
- Para cada
(linha de ): - Para cada
(coluna de ): - Calcule
como soma acumulada: inicialize soma ; para até faça . Ao fim, .
- Para cada
Observação prática rápida: para multiplicar sem errar no papel, organize as linhas de
e colunas de
e vá calculando termo a termo, riscando quando somou para não perder a conta. Em prova sem calculadora, trabalhe com números inteiros pequenos e simplifique passo a passo.
Complexidade: para
isso é perfeitamente viável — multiplicação faz
multiplica-mais-soma no total.
Passo 5
Boas práticas para implementar as funções (o que eu sempre faço):
- Validar tamanho de entrada e lançar erro amigável caso não sejam
. - Evitar alterar as matrizes de entrada (criar e retornar uma nova matriz).
- Para multiplicação: uma micro-otimização é iterar em ordem que reduza acessos repetidos (por exemplo, fixar
e e atualizar todas as colunas usando o mesmo ), mas para isso é só um detalhe. O importante é a clareza do código.
Passo 6
Resumo do que vai aparecer na resposta final (só para você saber o que encontrará):
- Quatro funções em Python:
- add_matrices(A,B)
- subtract_matrices(A,B)
- transpose_matrix(A)
- multiply_matrices(A,B)
Cada função recebe e retorna matrizes no formato lista de listas comlinhas e colunas. As funções validarão dimensão e retornarão a nova matriz resultado.
Resposta
from typing import List
Matrix10 = List[List[float]] # cada matriz é uma lista de 10 listas, cada uma com 10 números
def _check_10x10(M: Matrix10) -> None:
if not isinstance(M, list) or len(M) != 10:
raise ValueError("Matriz deve ter 10 linhas.")
for row in M:
if not isinstance(row, list) or len(row) != 10:
raise ValueError("Cada linha da matriz deve ter 10 elementos.")
def add_matrices(A: Matrix10, B: Matrix10) -> Matrix10:
"""
Retorna a soma de duas matrizes 10x10: C = A + B.
"""
_check_10x10(A)
_check_10x10(B)
return [[A[i][j] + B[i][j] for j in range(10)] for i in range(10)]
def subtract_matrices(A: Matrix10, B: Matrix10) -> Matrix10:
"""
Retorna a subtração de duas matrizes 10x10: C = A - B.
"""
_check_10x10(A)
_check_10x10(B)
return [[A[i][j] - B[i][j] for j in range(10)] for i in range(10)]
def transpose_matrix(A: Matrix10) -> Matrix10:
"""
Retorna a transposta de uma matriz 10x10: T = A^T.
"""
_check_10x10(A)
return [[A[j][i] for j in range(10)] for i in range(10)]
def multiply_matrices(A: Matrix10, B: Matrix10) -> Matrix10:
"""
Retorna o produto de duas matrizes 10x10: C = A * B.
Implementação com verificação de dimensão e multiplicação padrão.
"""
_check_10x10(A)
_check_10x10(B)
# inicializa matriz zero 10x10
C: Matrix10 = [[0.0 for _ in range(10)] for _ in range(10)]
# iteração na ordem i, k, j para aproveitar o valor A[i][k] durante a atualização de várias colunas
for i in range(10):
for k in range(10):
aik = A[i][k]
# se aik for zero, podemos pular (micro-otimização)
if aik == 0:
continue
row_bk = B[k]
row_ci = C[i]
for j in range(10):
row_ci[j] += aik * row_bk[j]
return C