{"id":3323,"date":"2013-05-13T11:16:12","date_gmt":"2013-05-13T11:16:12","guid":{"rendered":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/?p=3323"},"modified":"2013-05-13T11:16:57","modified_gmt":"2013-05-13T11:16:57","slug":"i1m2012-ejercicios-sobre-matrices-en-haskell-3","status":"publish","type":"post","link":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-ejercicios-sobre-matrices-en-haskell-3\/","title":{"rendered":"I1M2012: Ejercicios sobre matrices en Haskell (3)"},"content":{"rendered":"<p>En la clase hoy  <a href=\"http:\/\/www.cs.us.es\/~jalonso\/cursos\/i1m-12\">Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas<\/a> hemos continuando comentado las soluciones de los ejercicios sobre vectores y matrices en Haskell de la relaci\u00f3n 26 que vimos en la <a href=\"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/i1m2012-ejercicios-sobre-matrices-en-haskell-2\" >clase del d\u00eda 6<\/a>. Concretamente, de los ejercicios para<\/p>\n<ul>\n<li> intercambiar dos filas de una matriz (ej. 20),\n<li> intercambiar dos columnas de una matriz (ej. 21),\n<li> multiplicar una fila por un n\u00famero (ej. 22),\n<li> sumar a una fila otra fila (ej. 23),\n<li> sumar a una fila otra multiplicada por un n\u00famero (ej. 24) y\n<li> buscar el menor \u00edndice de un elemento no nulo en una columna (ej. 25).\n<\/ul>\n<p>Los ejercicios de la relaci\u00f3n, junto con las soluciones de los 19 primeros, se muestran a continuaci\u00f3n<br \/>\n<!--more--><\/p>\n<pre lang=\"haskell\">\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 20. Definir la funci\u00f3n\r\n--    intercambiaFilas :: Num a => Int -> Int -> Matriz a -> Matriz a\r\n-- tal que (intercambiaFilas k l p) es la matriz obtenida intercambiando\r\n-- las filas k y l de la matriz p. Por ejemplo, \r\n--    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]]\r\n--    ghci> intercambiaFilas 1 3 p\r\n--    array ((1,1),(3,3)) [((1,1),4),((1,2),6),((1,3),9),\r\n--                         ((2,1),3),((2,2),2),((2,3),6),\r\n--                         ((3,1),5),((3,2),1),((3,3),0)]\r\n--    ghci> matrizLista (intercambiaFilas 1 3 p)\r\n--    [[4,6,9],[3,2,6],[5,1,0]]\r\n-- ---------------------------------------------------------------------\r\n\r\nintercambiaFilas :: Num a => Int -> Int -> Matriz a -> Matriz a\r\nintercambiaFilas k l p = \r\n    array ((1,1), (m,n))\r\n          [((i,j), p! f i j) | i <- [1..m], j <- [1..n]]\r\n    where (m,n) = dimension p\r\n          f i j | i == k    = (l,j)\r\n                | i == l    = (k,j)\r\n                | otherwise = (i,j)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 21. Definir la funci\u00f3n\r\n--    intercambiaColumnas :: Num a => Int -> Int -> Matriz a -> Matriz a\r\n-- tal que (intercambiaColumnas k l p) es la matriz obtenida\r\n-- intercambiando las columnas k y l de la matriz p. Por ejemplo, \r\n--    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]]\r\n--    ghci> matrizLista (intercambiaColumnas 1 3 p)\r\n--    [[0,1,5],[6,2,3],[9,6,4]]\r\n-- ---------------------------------------------------------------------\r\n\r\nintercambiaColumnas :: Num a => Int -> Int -> Matriz a -> Matriz a\r\nintercambiaColumnas k l p = \r\n    array ((1,1), (m,n))\r\n          [((i,j), p ! f i j) | i <- [1..m], j <- [1..n]]\r\n    where (m,n) = dimension p\r\n          f i j | j == k    = (i,l)\r\n                | j == l    = (i,k)\r\n                | otherwise = (i,j)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 22. Definir la funci\u00f3n\r\n--    multFilaPor :: Num a => Int -> a -> Matriz a -> Matriz a\r\n-- tal que (multFilaPor k x p) es a matriz obtenida multiplicando la\r\n-- fila k de la matriz p por el n\u00famero x. Por ejemplo,\r\n--    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]]\r\n--    ghci> matrizLista (multFilaPor 2 3 p)\r\n--    [[5,1,0],[9,6,18],[4,6,9]]\r\n-- ---------------------------------------------------------------------\r\n\r\nmultFilaPor :: Num a => Int -> a -> Matriz a -> Matriz a\r\nmultFilaPor k x p = \r\n    array ((1,1), (m,n))\r\n          [((i,j), f i j)  | i <- [1..m], j <- [1..n]]\r\n    where (m,n) = dimension p\r\n          f i j | i == k    = x*(p!(i,j))\r\n                | otherwise = p!(i,j)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 23. Definir la funci\u00f3n\r\n--    sumaFilaFila :: Num a => Int -> Int -> Matriz a -> Matriz a\r\n-- tal que (sumaFilaFila k l p) es la matriz obtenida sumando la fila l\r\n-- a la fila k d la matriz p. Por ejemplo,\r\n--    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]]\r\n--    ghci> matrizLista (sumaFilaFila 2 3 p)\r\n--    [[5,1,0],[7,8,15],[4,6,9]]\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaFilaFila :: Num a => Int -> Int -> Matriz a -> Matriz a\r\nsumaFilaFila k l p = \r\n    array ((1,1), (m,n))\r\n          [((i,j), f i j) | i <- [1..m], j <- [1..n]]\r\n    where (m,n) = dimension p\r\n          f i j | i == k    = p!(i,j) + p!(l,j)\r\n                | otherwise = p!(i,j)        \r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 24. Definir la funci\u00f3n\r\n--    sumaFilaPor :: Num a => Int -> Int -> a -> Matriz a -> Matriz a\r\n-- tal que (sumaFilaPor k l x p) es la matriz obtenida sumando a la fila\r\n-- k de la matriz p la fila l multiplicada por x. Por ejemplo,\r\n--    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]]\r\n--    ghci> matrizLista (sumaFilaPor 2 3 10 p)\r\n--    [[5,1,0],[43,62,96],[4,6,9]]\r\n-- ---------------------------------------------------------------------\r\n\r\nsumaFilaPor :: Num a => Int -> Int -> a -> Matriz a -> Matriz a\r\nsumaFilaPor k l x p = \r\n    array ((1,1), (m,n))\r\n          [((i,j), f i j) | i <- [1..m], j <- [1..n]]\r\n    where (m,n) = dimension p\r\n          f i j | i == k    = p!(i,j) + x*p!(l,j)\r\n                | otherwise = p!(i,j)\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Triangularizaci\u00f3n de matrices                                      --\r\n-- ---------------------------------------------------------------------\r\n\r\n-- ---------------------------------------------------------------------\r\n-- Ejercicio 25. Definir la funci\u00f3n\r\n--    buscaIndiceDesde :: (Num a, Eq a) => \r\n--                        Matriz a -> Int -> Int -> Maybe Int\r\n-- tal que (buscaIndiceDesde p j i) es el menor \u00edndice k, mayor o igual\r\n-- que i, tal que el elemento de la matriz p en la posici\u00f3n (k,j) es no\r\n-- nulo. Por ejemplo,\r\n--    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]]\r\n--    ghci> buscaIndiceDesde p 3 2\r\n--    Just 2\r\n--    ghci> let q = listaMatriz [[5,1,1],[3,2,0],[4,6,0]]\r\n--    ghci> buscaIndiceDesde q 3 2\r\n--    Nothing\r\n-- ---------------------------------------------------------------------\r\n\r\nbuscaIndiceDesde :: (Num a, Eq a) => Matriz a -> Int -> Int -> Maybe Int\r\nbuscaIndiceDesde p j i \r\n    | null xs   = Nothing\r\n    | otherwise = Just (head xs)\r\n    where xs = [k | ((k,j'),y) <- assocs p, j == j', y \/= 0, k>=i] \r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En la clase hoy Inform\u00e1tica de 1\u00ba del Grado en Matem\u00e1ticas hemos continuando comentado las soluciones de los ejercicios sobre vectores y matrices en Haskell de la relaci\u00f3n 26 que vimos en la clase del d\u00eda 6. Concretamente, de los ejercicios para intercambiar dos filas de una matriz (ej. 20), intercambiar dos columnas de una&#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":[1],"tags":[270,298],"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\/3323"}],"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=3323"}],"version-history":[{"count":2,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3323\/revisions"}],"predecessor-version":[{"id":3325,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/posts\/3323\/revisions\/3325"}],"wp:attachment":[{"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/media?parent=3323"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/categories?post=3323"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.glc.us.es\/~jalonso\/vestigium\/wp-json\/wp\/v2\/tags?post=3323"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}