{"id":4247,"date":"2014-03-28T23:10:03","date_gmt":"2014-03-28T22:10:03","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=4247"},"modified":"2014-04-06T23:11:17","modified_gmt":"2014-04-06T21:11:17","slug":"i1m2013-ejercicios-sobre-vectores-y-matrices-en-haskell","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2013-ejercicios-sobre-vectores-y-matrices-en-haskell\/","title":{"rendered":"I1M2013: Ejercicios sobre vectores y matrices en Haskell"},"content":{"rendered":"<p>En las clase hoy  <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos comentado las soluciones de los 10 primeros ejercicios sobre vectores y matrices en Haskell de la <a href=\"http:\/\/bit.ly\/1qagY9d\">relaci\u00f3n 24<\/a>.<\/p>\n<p>Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Introducci\u00f3n                                                       --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- El objetivo de esta relaci\u00f3n es hacer ejercicios sobre vectores y\r\n-- matrices con el tipo de tablas de las tablas, definido en el m\u00f3dulo\r\n-- Data.Array y explicado en el tema 18 cuyas transparencias se\r\n-- encuentran en \r\n--    http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-13\/temas\/tema-18t.pdf\r\n-- Adem\u00e1s, en algunos ejemplos de usan matrices con n\u00fameros racionales.\r\n-- En Haskell, el n\u00famero racional x\/y se representa por x%y. El TAD de\r\n-- los n\u00fameros racionales est\u00e1 definido en el m\u00f3dulo Data.Ratio.\r\n \r\n-- ---------------------------------------------------------------------\r\n-- Importaci\u00f3n de librer\u00edas                                           --\r\n-- ---------------------------------------------------------------------\r\n\r\nimport Data.Array\r\nimport Data.Ratio\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Tipos de los vectores y de las matrices                            --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- Los vectores son tablas cuyos \u00edndices son n\u00fameros naturales.\r\ntype Vector a = Array Int a\r\n \r\n-- Las matrices son tablas cuyos \u00edndices son pares de n\u00fameros\r\n-- naturales. \r\ntype Matriz a = Array (Int,Int) a\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Operaciones b\u00e1sicas con matrices                                   --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 1. Definir la funci\u00f3n\r\n--    listaVector :: Num a => [a] -> Vector a\r\n-- tal que (listaVector xs) es el vector correspondiente a la lista\r\n-- xs. Por ejemplo, \r\n--    ghci> listaVector [3,2,5]\r\n--    array (1,3) [(1,3),(2,2),(3,5)]\r\n-- ---------------------------------------------------------------------\r\n\r\nlistaVector :: Num a => [a] -> Vector a\r\nlistaVector xs = listArray (1,n) xs\r\n    where n = length xs\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 2. Definir la funci\u00f3n\r\n--    listaMatriz :: Num a => [[a]] -> Matriz a\r\n-- tal que (listaMatriz xss) es la matriz cuyas filas son los elementos\r\n-- de xss. Por ejemplo,\r\n--    ghci> listaMatriz [[1,3,5],[2,4,7]]\r\n--    array ((1,1),(2,3)) [((1,1),1),((1,2),3),((1,3),5),\r\n--                         ((2,1),2),((2,2),4),((2,3),7)]\r\n-- ---------------------------------------------------------------------\r\n\r\nlistaMatriz :: Num a => [[a]] -> Matriz a\r\nlistaMatriz xss = listArray ((1,1),(m,n)) (concat xss)\r\n    where m = length xss\r\n          n = length (head xss)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 3. Definir la funci\u00f3n\r\n--    numFilas :: Num a => Matriz a -> Int\r\n-- tal que (numFilas m) es el n\u00famero de filas de la matriz m. Por\r\n-- ejemplo,\r\n--    numFilas (listaMatriz [[1,3,5],[2,4,7]])  ==  2\r\n-- ---------------------------------------------------------------------\r\n\r\nnumFilas :: Num a => Matriz a -> Int\r\nnumFilas = fst . snd . bounds\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 4. Definir la funci\u00f3n\r\n--    numColumnas :: Num a => Matriz a -> Int\r\n-- tal que (numColumnas m) es el n\u00famero de columnas de la matriz\r\n-- m. Por ejemplo,\r\n--    numColumnas (listaMatriz [[1,3,5],[2,4,7]])  ==  3\r\n-- ---------------------------------------------------------------------\r\n\r\nnumColumnas:: Num a => Matriz a -> Int\r\nnumColumnas = snd . snd . bounds\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 5. Definir la funci\u00f3n\r\n--    dimension :: Num a => Matriz a -> (Int,Int)\r\n-- tal que (dimension m) es el n\u00famero de columnas de la matriz m. Por\r\n-- ejemplo, \r\n--    dimension (listaMatriz [[1,3,5],[2,4,7]])  ==  (2,3)\r\n-- ---------------------------------------------------------------------\r\n\r\ndimension :: Num a => Matriz a -> (Int,Int)\r\ndimension p = (numFilas p, numColumnas p)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 6. Definir la funci\u00f3n\r\n--    separa :: Int -> [a] -> [[a]]\r\n-- tal que (separa n xs) es la lista obtenida separando los elementos de\r\n-- xs en grupos de n elementos (salvo el \u00faltimo que puede tener menos de\r\n-- n elementos). Por ejemplo, \r\n--    separa 3 [1..11]  ==  [[1,2,3],[4,5,6],[7,8,9],[10,11]]\r\n-- ---------------------------------------------------------------------\r\n\r\nsepara :: Int -> [a] -> [[a]]\r\nsepara _ [] = []\r\nsepara n xs = take n xs : separa n (drop n xs)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 7. Definir la funci\u00f3n\r\n--    matrizLista :: Num a => Matriz a -> [[a]]\r\n-- tal que (matrizLista x) es la lista de las filas de la matriz x. Por\r\n-- ejemplo, \r\n--    ghci> let m = listaMatriz [[5,1,0],[3,2,6]]\r\n--    ghci> m\r\n--    array ((1,1),(2,3)) [((1,1),5),((1,2),1),((1,3),0),\r\n--                         ((2,1),3),((2,2),2),((2,3),6)]\r\n--    ghci> matrizLista m\r\n--    [[5,1,0],[3,2,6]]\r\n-- ---------------------------------------------------------------------\r\n\r\nmatrizLista :: Num a => Matriz a -> [[a]]\r\nmatrizLista p = separa (numColumnas p) (elems p)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 8. Definir la funci\u00f3n\r\n--    vectorLista :: Num a => Vector a -> [a]\r\n-- tal que (vectorLista x) es la lista de los elementos del vector\r\n-- v. Por ejemplo, \r\n--    ghci> let v = listaVector [3,2,5]\r\n--    ghci> v\r\n--    array (1,3) [(1,3),(2,2),(3,5)]\r\n--    ghci> vectorLista v\r\n--    [3,2,5]\r\n-- ---------------------------------------------------------------------\r\n\r\nvectorLista :: Num a => Vector a -> [a]\r\nvectorLista = elems \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Suma de matrices                                                   --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 9. Definir la funci\u00f3n\r\n--    sumaMatrices:: Num a => Matriz a -> Matriz a -> Matriz a\r\n-- tal que (sumaMatrices x y) es la suma de las matrices x e y. Por\r\n-- ejemplo, \r\n--    ghci> let m1 = listaMatriz [[5,1,0],[3,2,6]]\r\n--    ghci> let m2 = listaMatriz [[4,6,3],[1,5,2]]\r\n--    ghci> matrizLista (sumaMatrices m1 m2)\r\n--    [[9,7,3],[4,7,8]]\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaMatrices:: Num a => Matriz a -> Matriz a -> Matriz a\r\nsumaMatrices p q = \r\n    array ((1,1),(m,n)) [((i,j),p!(i,j)+q!(i,j)) | \r\n                         i <- [1..m], j <- [1..n]]\r\n    where (m,n) = dimension p\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 10. Definir la funci\u00f3n\r\n--    filaMat :: Num a => Int -> Matriz a -> Vector a\r\n-- tal que (filaMat i p) es el vector correspondiente a la fila i-\u00e9sima\r\n-- de la matriz p. Por ejemplo,\r\n--    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,5,7]]\r\n--    ghci> filaMat 2 p\r\n--    array (1,3) [(1,3),(2,2),(3,6)]\r\n--    ghci> vectorLista (filaMat 2 p)\r\n--    [3,2,6]\r\n-- ---------------------------------------------------------------------\r\n\r\nfilaMat :: Num a => Int -> Matriz a -> Vector a\r\nfilaMat i p = array (1,n) [(j,p!(i,j)) | j <- [1..n]]\r\n    where n = numColumnas p\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En las clase hoy Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos comentado las soluciones de los 10 primeros ejercicios sobre vectores y matrices en Haskell de la relaci\u00f3n 24. Los ejercicios y su soluci\u00f3n se muestran a continuaci\u00f3n<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","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":[222],"tags":[270,300],"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\/4247"}],"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=4247"}],"version-history":[{"count":1,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4247\/revisions"}],"predecessor-version":[{"id":4248,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/4247\/revisions\/4248"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=4247"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=4247"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=4247"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}