{"id":661,"date":"2017-04-13T21:41:03","date_gmt":"2017-04-14T00:41:03","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/programacao\/?p=661"},"modified":"2021-06-18T15:15:04","modified_gmt":"2021-06-18T18:15:04","slug":"operacao-matriz-transposta-python","status":"publish","type":"post","link":"http:\/\/www.galirows.com.br\/meublog\/programacao\/operacao-matriz-transposta-python\/","title":{"rendered":"Confirma\u00e7\u00e3o de resultado com matriz transposta &#8211; Python"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Elabore um algoritmo que receba uma matriz quadrada de ordem <em>n<\/em>. Primeiro ser\u00e1 fornecido o valor de <em>n<\/em> e depois os valores de uma matriz A. Por fim ser\u00e3o fornecidos valores para uma outra matriz, matriz B. O algoritmo deve comparar se a matriz B \u00e9 o resultado correto da multiplica\u00e7\u00e3o da matriz A por sua transposta.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Exemplo:<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><strong>Entrada<\/strong><\/td><td><strong>Sa\u00edda<\/strong><\/td><\/tr><tr><td>2<br>1 2<br>4 5<br>5 14<br>14 41<\/td><td>correto<\/td><\/tr><tr><td>2<br>1 2<br>4 5<br>5 14<br>14 14<\/td><td>incorreto<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><b><br><\/b><strong>Solu\u00e7\u00e3o em Python, sem fun\u00e7\u00e3o<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Veja que nessa solu\u00e7\u00e3o j\u00e1 s\u00e3o criadas as matrizes com valores. Pelo enunciado o tamanho e os valores deveriam ser fornecidos pelo usu\u00e1rio. Fiz do jeito que est\u00e1 para ser mais r\u00e1pido de testar, mas deveria ser alterado depois.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:python decode:true\"><code lang=\"python\" class=\"language-python\">tam = 3\nmA = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]\nmB = [[14, 32,  50],[32, 77,  122],[50, 122, 194]]\nmT = [[0,0,0],[0,0,0],[0,0,0]]\nmR = [[0,0,0],[0,0,0],[0,0,0]]\n\n#transposta\nfor i in range(tam):\n    for j in range(tam):\n        mT[i][j] = mA[j][i]\n\n#multiplica\nfor i in range(tam):\n    for k in range(tam):\n        soma = 0\n        for j in range(tam):\n            soma = soma + mA[i][j] * mT[j][k]\n        mR[i][k] = soma\n\n#compara matrizes\niguais = True\nfor i in range(tam):\n    for j in range(tam):\n        if mR[i][j] != mB[i][j]:\n            iguais = False\n            print \"diferentes na posicao\", i, j\n            break #faz para os FOR quando achar\nif iguais:\n    print \"correto\\n\"\nelse:\n    print \"incorreto\\n\"\n\n#apenas para mostrar os valores das matrizes\nprint \"Matriz A\"\nfor i in range(tam):\n    print mA[i][:]\n    \nprint \"\\nMatriz A'\"\nfor i in range(tam):\n    print mT[i][:]\n\nprint \"\\nMatrizA * MatrizA'\"\nfor i in range(tam):\n    print mR[i][:]\n\nprint \"\\nMatriz B\"\nfor i in range(tam):\n    print mB[i][:]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Teste o c\u00f3digo:<\/strong> <a href=\"http:\/\/www.codeskulptor.org\/#user43_Sct2NYMICH_0.py\" target=\"_blank\" rel=\"noopener\">http:\/\/www.codeskulptor.org\/#user43_Sct2NYMICH_0.py<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solu\u00e7\u00e3o em Python, com fun\u00e7\u00e3o<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na solu\u00e7\u00e3o utilizando fun\u00e7\u00f5es fiz fun\u00e7\u00f5es mais gen\u00e9ricas do que era necess\u00e1rio. Por exemplo, o exerc\u00edcio solicitava uma matriz quadrada, mas as fun\u00e7\u00f5es de criar matriz e multiplicar matrizes, funcionam tamb\u00e9m para matrizes n\u00e3o quadradas e poderiam ser utilizadas em outras solu\u00e7\u00f5es.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Destaco uma considera\u00e7\u00e3o sobre a multiplica\u00e7\u00e3o de matrizes: na multiplica\u00e7\u00e3o de matrizes, o n\u00famero de colunas da primeira matriz deve ser igual ao n\u00famero de linhas da segunda matriz. Por isso que minha fun\u00e7\u00e3o somente recebe 3 par\u00e2metros com rela\u00e7\u00e3o ao tamanho das matrizes.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:python decode:true\"><code lang=\"python\" class=\"language-python\">def criaMatriz(linhas, colunas):\n    mat = [0]*linhas\n    for i in range(linhas):\n        mat[i] = [0]*colunas\n    return mat\n\ndef mostraMatriz(mat, linhas):\n    for i in range(linhas):\n        print mat[i][:]\n    \ndef transposta(mat, ordem):\n    transposta = criaMatriz(ordem, ordem)\n    for i in range(tam):\n        for j in range(tam):\n            transposta[i][j] = mA[j][i]\n    return transposta\n\ndef multiplica(matA, matB, linA, colA, colB):\n    res = criaMatriz(linA, colB)\n    for i in range(linA):\n        for k in range(colB):\n            soma = 0\n            for j in range(colA):\n                soma = soma + mA[i][j] * mT[j][k]\n            res[i][k] = soma\n    return res\n\n#=========== programa principal ===========\ntam = 3\nmA = [[1, 2, 3], \n      [4, 5, 6],\n      [7, 8, 9]]\nmB = [[14, 32,  50], \n      [32, 77,  122],\n      [50, 122, 194]]\n\n#transposta\nmT = transposta(mA, tam)\n\n#multiplica\nmR = multiplica(mA, mT, tam, tam, tam)\n\n#compara matrizes\niguais = True\nfor i in range(tam):\n    for j in range(tam):\n        if mR[i][j] != mB[i][j]:\n            iguais = False\n            print \"diferentes na posicao\", i, j\n            break #faz parar os FOR quando achar\nif iguais:\n    print \"correto\\n\"\nelse:\n    print \"incorreto\\n\"\n\n#apenas para mostrar os valores das matrizes\nprint \"Matriz A\"\nmostraMatriz(mA, tam)\n    \nprint \"\\nMatriz A'\"\nmostraMatriz(mT, tam)\n\nprint \"\\nMatrizA * MatrizA'\"\nmostraMatriz(mR, tam)\n\nprint \"\\nMatriz B\"\nmostraMatriz(mB, tam)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Teste o c\u00f3digo:<\/strong> <a href=\"http:\/\/www.codeskulptor.org\/#user43_JcJz6MpHAe_0.py\" target=\"_blank\" rel=\"noopener\">http:\/\/www.codeskulptor.org\/#user43_JcJz6MpHAe_0.py<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Solu\u00e7\u00e3o em Python utilizando a biblioteca NumPy<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Para finalizar, segue uma solu\u00e7\u00e3o do exerc\u00edcio utilizando a biblioteca NumPy, que facilita muito a manipula\u00e7\u00e3o de vetores e matrizes. Veja que ela j\u00e1 possui as fun\u00e7\u00f5es para multiplicar, fazer a transposta e at\u00e9 comparar matrizes.<\/p>\n\n\n\n<pre class=\"wp-block-code lang:python decode:true\"><code lang=\"python\" class=\"language-python\">import numpy as np\n\nmA = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]])\nmB = np.array([[14, 32,  50],[32, 77,  122],[50, 122, 194]])\n\n#transposta\nmT = mA.transpose()\n\n#multiplica\nmR = np.dot(mA, mT)\n\n#compara matrizes\nif np.array_equal(mR, mB):\n    print \"correto\\n\"\nelse:\n    print \"incorreto\\n\"\n\n#apenas para mostrar os valores das matrizes\nprint \"Matriz A\"\nprint mA\n    \nprint \"\\nMatriz A'\"\nprint mT\n\nprint \"\\nMatrizA * MatrizA'\"\nprint mR\n\nprint \"\\nMatriz B\"\nprint mB<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Teste o c\u00f3digo:<\/strong> <a href=\"https:\/\/ideone.com\/bTMhY1\" target=\"_blank\" rel=\"noopener\">https:\/\/ideone.com\/bTMhY1<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Elabore um algoritmo que receba uma matriz quadrada de ordem n. Primeiro ser\u00e1 fornecido o valor de n e depois os valores de uma matriz A. Por fim ser\u00e3o fornecidos valores para uma outra matriz, matriz B. O algoritmo deve comparar se a matriz B \u00e9 o resultado correto da multiplica\u00e7\u00e3o da matriz A por [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[5],"tags":[13,45],"class_list":["post-661","post","type-post","status-publish","format-standard","hentry","category-python","tag-matriz","tag-numpy"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/661","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/comments?post=661"}],"version-history":[{"count":7,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/661\/revisions"}],"predecessor-version":[{"id":1060,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/posts\/661\/revisions\/1060"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/media?parent=661"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/categories?post=661"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/programacao\/wp-json\/wp\/v2\/tags?post=661"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}