Skip to content

Instantly share code, notes, and snippets.

@zeehio
Created December 10, 2013 17:33
Show Gist options
  • Save zeehio/7894622 to your computer and use it in GitHub Desktop.
Save zeehio/7894622 to your computer and use it in GitHub Desktop.
Resolucio exercici producte matrius
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"# Objectius de la classe\n",
"\n",
"* Resoldre exercicis de matrius (5.1.2)\n",
"* Repassar fitxers\n",
"* Dubtes de tot tipus\n",
"\n",
"## El meu nom:\n",
"\n",
"* Sergi"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "skip"
}
},
"source": [
"# Exercicis de matrius\n",
"En aquests exercicis practicarem l'aplicaci\u00f3 de llistes i bucles `for` al c\u00e0lcul matricial."
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Exercici 1: generaci\u00f3 d'una matriu aleat\u00f2ria\n",
"\n",
"Definiu una funci\u00f3 que retoni una matriu, amb les seg\u00fcents especificacions:\n",
"\n",
"1. Anomeneu la funci\u00f3 `genera_matriu(nFil, nCol)`\n",
"1. Els dos arguments donen respectivament el n\u00famero de files i columnes de la matriu a generar\n",
"1. Els elements de la matriu generada s'han d'omplir amb valors enters aleatoris entre 0 i 99 (aix\u00f2 far\u00e0 m\u00e9s f\u00e0cils la impressi\u00f3 de les matrius i la verificaci\u00f3 de resultats)\n",
"1. La funci\u00f3 ha de retornar la matriu generada, en forma d'una llista 2D"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Soluci\u00f3:\n",
"import random\n",
"def genera_matriu(nFil, nCol):\n",
" \"\"\"Funci\u00f3 que genera una matriu nFil x Ncol on les \n",
" components s\u00f3n n\u00fameros enters aleatoris entre 0 i 99\"\"\"\n",
" \n",
" # Creem la llista que contindr\u00e0 la matriu\n",
" matriu=[]\n",
" \n",
" # Anem generant per files\n",
" for i in range(nFil):\n",
" fila=[] # Llista que contindr\u00e0 la fila generada\n",
" \n",
" # Generem els elements de la fila, un per columna\n",
" for j in range(nCol):\n",
" fila.append(random.randint(0,99))\n",
" \n",
" # Afegim la fila generada a la matriu\n",
" matriu.append(fila)\n",
" \n",
" return matriu\n",
"\n",
"# Comprovem que funciona\n",
"m = genera_matriu(3,3)\n",
"print m"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[18, 72, 2], [61, 10, 95], [7, 87, 99]]\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import random\n",
"# Soluci\u00f3 compacta\n",
"def genera_matriu2(nFil, nCol):\n",
" \"\"\"Funci\u00f3 que genera una matriu nFil x Ncol on les \n",
" components s\u00f3n n\u00fameros enters aleatoris entre 0 i 99\"\"\"\n",
" \n",
" return [ [random.randint(0,99) for i in range(nCol)] for i in range(nFil)]\n",
"\n",
"# Comprovem que funciona\n",
"m = genera_matriu2(3,3)\n",
"print m"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"[[54, 97, 5], [70, 13, 1], [58, 66, 50]]\n"
]
}
],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Exercici 2: impressi\u00f3 d'una matriu\n",
"\n",
"Per tal de poder visualitzar millor les matrius que usarem definiu una funci\u00f3 que les imprimeixi en un format elegant:\n",
"\n",
"1. La funci\u00f3 s'ha d'anomenar `presentar_matriu(matriu)`\n",
"1. Rep com a argument una matriu\n",
"2. La imprimeix en format encolumnat; com que les components s\u00f3n enters entre 0 i 99 podeu aprofitar aquest fer per encolumnar-les facilment\n",
"1. La funci\u00f3 no ha de retornar res, nom\u00e9s imprimir la matriu per consola\n",
"\n",
"El resultat hauria de ser de la forma\n",
"\n",
" 4 96 67 78 4 94 80 \n",
" 61 62 83 79 99 21 65 \n",
" 80 33 64 80 24 75 41 \n",
" 1 8 17 26 64 92 88 \n",
" 21 45 69 30 55 97 15 \n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def presenta_matriu(matriu):\n",
" \"\"\"Funci\u00f3 que imprimeix per consola una matriu nFil x Ncol on les \n",
" components s\u00f3n n\u00fameros enters aleatoris entre 0 i 99\"\"\"\n",
" \n",
" # Imprimim per files\n",
" for fila in matriu:\n",
" \n",
" # Un element de columna darrera l'altre\n",
" for element in fila:\n",
" print \"%3d \" % element,\n",
" print\n",
"\n",
"# Comprovem que funciona\n",
"m = genera_matriu(5,7)\n",
"presenta_matriu(m)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 14 51 83 21 64 33 29 \n",
" 96 8 44 51 40 56 89 \n",
" 8 89 85 34 41 27 19 \n",
" 10 41 56 55 22 21 51 \n",
" 88 45 34 97 68 67 90 \n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "slide"
}
},
"source": [
"## Exercici 3: producte de matrius\n",
"\n",
"Definiu una funci\u00f3 que calculi el producte de dos matrius:\n",
"\n",
"1. La funci\u00f3 s'anomenara `multiplica_matrius(m1,m2)`\n",
"1. Rep com a arguments dues matrius\n",
"1. Verifica que les dimensions de les matrius siguin compatibles pel producte. En cas que no ho siguin mostra un missatge d'error per consola\n",
"1. Si s\u00f3n compatibles retorna el resultat del producte de matrius"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"## Sabem multiplicar matrius?\n",
"Tenim la matriu $A$:\n",
"$$ A = \\left ( \\begin{matrix} 1 & 2 & 3 \\\\ 4 & 5 & 6 \\\\ 7 & 8 & 9 \\\\ -6 & -8 & -4 \\end{matrix} \\right ) $$\n",
"I la matriu $ B$:\n",
"$$ B = \\left ( \\begin{matrix} 1 & 4 \\\\ -4 & 3 \\\\ 1 & -1 \\end{matrix} \\right ) $$\n",
"\n",
"Volem trobar $$ C= A \\cdot B $$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"### Quant val $c[0,0]$?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"\"Fila per columna\"\n",
"$$ c[0,0] = 1 \\cdot 1 + 2 \\cdot -4 + 3 \\cdot 1 = 1 - 8 + 4 = -3 $$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Quant val $c[i,j]$?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"\n",
"$$ c[i,j] = a[i,0] \\cdot b[0,j] + a[i,1] \\cdot b[1,j] + a[i,2] \\cdot b[2,j] $$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"source": [
"### Quant val $c[i,j]$?\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"\n",
"$$ c[i,j] = a[i,0] \\cdot b[0,j] + a[i,1] \\cdot b[1,j] + a[i,2] \\cdot b[2,j] $$\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"slideshow": {
"slide_type": "fragment"
}
},
"source": [
"## Al loro!\n",
"#### Si no sabem la mida d'A i de B, el sumatori 0, 1, 2... necessita el seu propi bucle!\n",
"\n",
"$$ c[i,j] = \\sum_{k=0}^{ncol(A)} a[i,k] \\cdot b[k,j] $$\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def multiplica_matrius(m1,m2):\n",
" \"\"\"Multiplica les matrius m1 i m2 i retorna el resultat. \n",
" Les dimensions de les matrius han de ser compatibles per\n",
" al producte\"\"\"\n",
" m1rows = len(m1)\n",
" m1cols = len(m1[0])\n",
" m2rows = len(m2)\n",
" m2cols = len(m2[0])\n",
" # Comprovem les dimensions de les matrius. Suposem que \n",
" # s\u00f3n matrius regulars, de manera que la mida de la primera\n",
" # columna \u00e9s representativa de m1\n",
" if m1cols != m2rows:\n",
" print \"Matrius incompatibles: no es pot fer el producte\"\n",
" return\n",
" \n",
" # Fem el producte\n",
" mp=[]\n",
" for i in range(m1rows): # Index que recorre les files de m1\n",
" fila_mp=[]\n",
" for j in range(m2cols): # Index que recorre les columnes de m2\n",
" suma=0\n",
" for k in range(m1cols): # Index del sumatori fila_m1 x col_m2\n",
" suma= suma + m1[i][k]*m2[k][j]\n",
" fila_mp.append(suma)\n",
" mp.append(fila_mp)\n",
" return mp\n",
" \n",
"# Provem que funcioni\n",
"m1 = genera_matriu(3,5)\n",
"m2 = genera_matriu(5,3)\n",
"mp = multiplica_matrius(m1,m2)\n",
"\n",
"presenta_matriu(m1)\n",
"print\n",
"presenta_matriu(m2)\n",
"print\n",
"presenta_matriu(mp)"
],
"language": "python",
"metadata": {
"slideshow": {
"slide_type": "subslide"
}
},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
" 29 24 18 83 35 \n",
" 86 23 11 54 99 \n",
" 95 43 27 45 88 \n",
"\n",
" 54 59 56 \n",
" 1 75 24 \n",
" 77 55 73 \n",
" 2 40 51 \n",
" 75 91 8 \n",
"\n",
"5767 11006 8027 \n",
"13047 18573 9717 \n",
"13942 20123 11322 \n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment