Confirmação de resultado com matriz transposta – Python

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:

EntradaSaí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

Share

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.