{"id":5281,"date":"2016-01-13T16:28:09","date_gmt":"2016-01-13T15:28:09","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=5281"},"modified":"2016-01-13T16:28:09","modified_gmt":"2016-01-13T15:28:09","slug":"matrices-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/matrices-en-haskell\/","title":{"rendered":"Matrices en Haskell"},"content":{"rendered":"<p>En la clase de hoy del curso de <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-15\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> se ha estudiado c\u00f3mo trabajar con tablas en Haskell usando el m\u00f3dulo Data.Array.<\/p>\n<p>En la primera parte se ha explicado <a href=\"http:\/\/bit.ly\/1Q5ktyB\">El tipo predefinido de las tablas (&#8220;arrays&#8221;)<\/a> se han estudiado las funciones sobre \u00edndices (range, index, inRange, rangeSize) y sobre tablas (array, (!), bounds, indices, elems, assocs, (\/\/), listArray y accumArray). Tambi\u00e9n se han estudiado ejemplos de definiciones con dichas funciones.<\/p>\n<p>En la segunda parte se han comentado las soluciones de los siguientes ejercicios de la <a href=\"http:\/\/bit.ly\/1Q5jmPp\">Relaci\u00f3n 18<\/a>:<\/p>\n<p><!--more--><\/p>\n<pre lang=\"haskell\">\n-- ---------------------------------------------------------------------\n-- Importaci\u00f3n de librer\u00edas                                           --\n-- ---------------------------------------------------------------------\n\nimport Data.Array\n\n-- ---------------------------------------------------------------------\n-- Tipos de los vectores y de las matrices                            --\n-- ---------------------------------------------------------------------\n\n-- Los vectores son tablas cuyos \u00edndices son n\u00fameros naturales.\ntype Vector a = Array Int a\n \n-- Las matrices son tablas cuyos \u00edndices son pares de n\u00fameros\n-- naturales. \ntype Matriz a = Array (Int,Int) a\n\n-- ---------------------------------------------------------------------\n-- Operaciones b\u00e1sicas con matrices                                   --\n-- ---------------------------------------------------------------------\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 1. Definir la funci\u00f3n\n--    listaVector :: Num a => [a] -> Vector a\n-- tal que (listaVector xs) es el vector correspondiente a la lista\n-- xs. Por ejemplo, \n--    ghci> listaVector [3,2,5]\n--    array (1,3) [(1,3),(2,2),(3,5)]\n-- ---------------------------------------------------------------------\n\nlistaVector :: Num a => [a] -> Vector a\nlistaVector xs = listArray (1,n) xs\n    where n = length xs\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 2. Definir la funci\u00f3n\n--    listaMatriz :: Num a => [[a]] -> Matriz a\n-- tal que (listaMatriz xss) es la matriz cuyas filas son los elementos\n-- de xss. Por ejemplo,\n--    ghci> listaMatriz [[1,3,5],[2,4,7]]\n--    array ((1,1),(2,3)) [((1,1),1),((1,2),3),((1,3),5),\n--                         ((2,1),2),((2,2),4),((2,3),7)]\n-- ---------------------------------------------------------------------\n\nlistaMatriz :: Num a => [[a]] -> Matriz a\nlistaMatriz xss = listArray ((1,1),(m,n)) (concat xss)\n    where m = length xss\n          n = length (head xss)\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 3. Definir la funci\u00f3n\n--    numFilas :: Num a => Matriz a -> Int\n-- tal que (numFilas m) es el n\u00famero de filas de la matriz m. Por\n-- ejemplo,\n--    numFilas (listaMatriz [[1,3,5],[2,4,7]])  ==  2\n-- ---------------------------------------------------------------------\n\nnumFilas :: Num a => Matriz a -> Int\nnumFilas = fst . snd . bounds\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 4. Definir la funci\u00f3n\n--    numColumnas :: Num a => Matriz a -> Int\n-- tal que (numColumnas m) es el n\u00famero de columnas de la matriz\n-- m. Por ejemplo,\n--    numColumnas (listaMatriz [[1,3,5],[2,4,7]])  ==  3\n-- ---------------------------------------------------------------------\n\nnumColumnas:: Num a => Matriz a -> Int\nnumColumnas = snd . snd . bounds\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 5. Definir la funci\u00f3n\n--    dimension :: Num a => Matriz a -> (Int,Int)\n-- tal que (dimension m) es la dimensi\u00f3n de la matriz m. Por ejemplo, \n--    dimension (listaMatriz [[1,3,5],[2,4,7]])  ==  (2,3)\n-- ---------------------------------------------------------------------\n\ndimension :: Num a => Matriz a -> (Int,Int)\ndimension = snd . bounds\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 9. Definir la funci\u00f3n\n--    sumaMatrices:: Num a => Matriz a -> Matriz a -> Matriz a\n-- tal que (sumaMatrices x y) es la suma de las matrices x e y. Por\n-- ejemplo, \n--    ghci> let m1 = listaMatriz [[5,1,0],[3,2,6]]\n--    ghci> let m2 = listaMatriz [[4,6,3],[1,5,2]]\n--    ghci> matrizLista (sumaMatrices m1 m2)\n--    [[9,7,3],[4,7,8]]\n-- ---------------------------------------------------------------------\n\nsumaMatrices:: Num a => Matriz a -> Matriz a -> Matriz a\nsumaMatrices p q = \n    array ((1,1),(m,n)) [((i,j),p!(i,j)+q!(i,j))  \n                        | i <- [1..m], j <- [1..n]]\n    where (m,n) = dimension p\n\n-- ---------------------------------------------------------------------\n-- Ejercicio 14. Definir la funci\u00f3n\n--    identidad :: Num a => Int -> Matriz a\n-- tal que (identidad n) es la matriz identidad de orden n. Por ejemplo, \n--    ghci> identidad 3\n--    array ((1,1),(3,3)) [((1,1),1),((1,2),0),((1,3),0),\n--                         ((2,1),0),((2,2),1),((2,3),0),\n--                         ((3,1),0),((3,2),0),((3,3),1)]\n-- ---------------------------------------------------------------------\n\nidentidad :: Num a => Int -> Matriz a\nidentidad n =     \n    array ((1,1),(n,n))\n          [((i,j),f i j) | i <- [1..n], j <- [1..n]]\n    where f i j | i == j    = 1\n                | otherwise = 0\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase de hoy del curso de Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas se ha estudiado c\u00f3mo trabajar con tablas en Haskell usando el m\u00f3dulo Data.Array. En la primera parte se ha explicado El tipo predefinido de las tablas (&#8220;arrays&#8221;) se han estudiado las funciones sobre \u00edndices (range, index, inRange, rangeSize) y sobre&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false},"categories":[250],"tags":[270,310],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_likes_enabled":false,"_links":{"self":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5281"}],"collection":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/comments?post=5281"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5281\/revisions"}],"predecessor-version":[{"id":5282,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/5281\/revisions\/5282"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=5281"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=5281"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=5281"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}