Elabore um algoritmo que receba uma matriz quadrada de ordem n. Primeiro será fornecido o valor de n e depois os valores de uma matriz A. Por fim serão fornecidos valores para uma outra matriz, matriz B. O algoritmo deve comparar se a matriz B é o resultado correto da multiplicação da matriz A por sua transposta.
Exemplo:
Entrada | Saída |
2 1 2 4 5 5 14 14 41 | correto |
2 1 2 4 5 5 14 14 14 | incorreto |
Solução em Python, sem função
Veja que nessa solução já são criadas as matrizes com valores. Pelo enunciado o tamanho e os valores deveriam ser fornecidos pelo usuário. Fiz do jeito que está para ser mais rápido de testar, mas deveria ser alterado depois.
tam = 3
mA = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]
mB = [[14, 32, 50],[32, 77, 122],[50, 122, 194]]
mT = [[0,0,0],[0,0,0],[0,0,0]]
mR = [[0,0,0],[0,0,0],[0,0,0]]
#transposta
for i in range(tam):
for j in range(tam):
mT[i][j] = mA[j][i]
#multiplica
for i in range(tam):
for k in range(tam):
soma = 0
for j in range(tam):
soma = soma + mA[i][j] * mT[j][k]
mR[i][k] = soma
#compara matrizes
iguais = True
for i in range(tam):
for j in range(tam):
if mR[i][j] != mB[i][j]:
iguais = False
print "diferentes na posicao", i, j
break #faz para os FOR quando achar
if iguais:
print "correto\n"
else:
print "incorreto\n"
#apenas para mostrar os valores das matrizes
print "Matriz A"
for i in range(tam):
print mA[i][:]
print "\nMatriz A'"
for i in range(tam):
print mT[i][:]
print "\nMatrizA * MatrizA'"
for i in range(tam):
print mR[i][:]
print "\nMatriz B"
for i in range(tam):
print mB[i][:]
Teste o código: http://www.codeskulptor.org/#user43_Sct2NYMICH_0.py
Solução em Python, com função
Na solução utilizando funções fiz funções mais genéricas do que era necessário. Por exemplo, o exercício solicitava uma matriz quadrada, mas as funções de criar matriz e multiplicar matrizes, funcionam também para matrizes não quadradas e poderiam ser utilizadas em outras soluções.
Destaco uma consideração sobre a multiplicação de matrizes: na multiplicação de matrizes, o número de colunas da primeira matriz deve ser igual ao número de linhas da segunda matriz. Por isso que minha função somente recebe 3 parâmetros com relação ao tamanho das matrizes.
def criaMatriz(linhas, colunas):
mat = [0]*linhas
for i in range(linhas):
mat[i] = [0]*colunas
return mat
def mostraMatriz(mat, linhas):
for i in range(linhas):
print mat[i][:]
def transposta(mat, ordem):
transposta = criaMatriz(ordem, ordem)
for i in range(tam):
for j in range(tam):
transposta[i][j] = mA[j][i]
return transposta
def multiplica(matA, matB, linA, colA, colB):
res = criaMatriz(linA, colB)
for i in range(linA):
for k in range(colB):
soma = 0
for j in range(colA):
soma = soma + mA[i][j] * mT[j][k]
res[i][k] = soma
return res
#=========== programa principal ===========
tam = 3
mA = [[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]
mB = [[14, 32, 50],
[32, 77, 122],
[50, 122, 194]]
#transposta
mT = transposta(mA, tam)
#multiplica
mR = multiplica(mA, mT, tam, tam, tam)
#compara matrizes
iguais = True
for i in range(tam):
for j in range(tam):
if mR[i][j] != mB[i][j]:
iguais = False
print "diferentes na posicao", i, j
break #faz parar os FOR quando achar
if iguais:
print "correto\n"
else:
print "incorreto\n"
#apenas para mostrar os valores das matrizes
print "Matriz A"
mostraMatriz(mA, tam)
print "\nMatriz A'"
mostraMatriz(mT, tam)
print "\nMatrizA * MatrizA'"
mostraMatriz(mR, tam)
print "\nMatriz B"
mostraMatriz(mB, tam)
Teste o código: http://www.codeskulptor.org/#user43_JcJz6MpHAe_0.py
Solução em Python utilizando a biblioteca NumPy
Para finalizar, segue uma solução do exercício utilizando a biblioteca NumPy, que facilita muito a manipulação de vetores e matrizes. Veja que ela já possui as funções para multiplicar, fazer a transposta e até comparar matrizes.
import numpy as np
mA = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
mB = np.array([[14, 32, 50],[32, 77, 122],[50, 122, 194]])
#transposta
mT = mA.transpose()
#multiplica
mR = np.dot(mA, mT)
#compara matrizes
if np.array_equal(mR, mB):
print "correto\n"
else:
print "incorreto\n"
#apenas para mostrar os valores das matrizes
print "Matriz A"
print mA
print "\nMatriz A'"
print mT
print "\nMatrizA * MatrizA'"
print mR
print "\nMatriz B"
print mB
Teste o código: https://ideone.com/bTMhY1