I1M2012: Ejercicios sobre matrices en Haskell (3)
En la clase hoy Informática de 1º del Grado en Matemáticas hemos continuando comentado las soluciones de los ejercicios sobre vectores y matrices en Haskell de la relación 26 que vimos en la clase del día 6. Concretamente, de los ejercicios para
- intercambiar dos filas de una matriz (ej. 20),
- intercambiar dos columnas de una matriz (ej. 21),
- multiplicar una fila por un número (ej. 22),
- sumar a una fila otra fila (ej. 23),
- sumar a una fila otra multiplicada por un número (ej. 24) y
- buscar el menor índice de un elemento no nulo en una columna (ej. 25).
Los ejercicios de la relación, junto con las soluciones de los 19 primeros, se muestran a continuación
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | -- --------------------------------------------------------------------- -- Ejercicio 20. Definir la función --    intercambiaFilas :: Num a => Int -> Int -> Matriz a -> Matriz a -- tal que (intercambiaFilas k l p) es la matriz obtenida intercambiando -- las filas k y l de la matriz p. Por ejemplo,  --    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]] --    ghci> intercambiaFilas 1 3 p --    array ((1,1),(3,3)) [((1,1),4),((1,2),6),((1,3),9), --                         ((2,1),3),((2,2),2),((2,3),6), --                         ((3,1),5),((3,2),1),((3,3),0)] --    ghci> matrizLista (intercambiaFilas 1 3 p) --    [[4,6,9],[3,2,6],[5,1,0]] -- --------------------------------------------------------------------- intercambiaFilas :: Num a => Int -> Int -> Matriz a -> Matriz a intercambiaFilas k l p =      array ((1,1), (m,n))           [((i,j), p! f i j) | i <- [1..m], j <- [1..n]]     where (m,n) = dimension p           f i j | i == k    = (l,j)                 | i == l    = (k,j)                 | otherwise = (i,j) -- --------------------------------------------------------------------- -- Ejercicio 21. Definir la función --    intercambiaColumnas :: Num a => Int -> Int -> Matriz a -> Matriz a -- tal que (intercambiaColumnas k l p) es la matriz obtenida -- intercambiando las columnas k y l de la matriz p. Por ejemplo,  --    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]] --    ghci> matrizLista (intercambiaColumnas 1 3 p) --    [[0,1,5],[6,2,3],[9,6,4]] -- --------------------------------------------------------------------- intercambiaColumnas :: Num a => Int -> Int -> Matriz a -> Matriz a intercambiaColumnas k l p =      array ((1,1), (m,n))           [((i,j), p ! f i j) | i <- [1..m], j <- [1..n]]     where (m,n) = dimension p           f i j | j == k    = (i,l)                 | j == l    = (i,k)                 | otherwise = (i,j) -- --------------------------------------------------------------------- -- Ejercicio 22. Definir la función --    multFilaPor :: Num a => Int -> a -> Matriz a -> Matriz a -- tal que (multFilaPor k x p) es a matriz obtenida multiplicando la -- fila k de la matriz p por el número x. Por ejemplo, --    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]] --    ghci> matrizLista (multFilaPor 2 3 p) --    [[5,1,0],[9,6,18],[4,6,9]] -- --------------------------------------------------------------------- multFilaPor :: Num a => Int -> a -> Matriz a -> Matriz a multFilaPor k x p =      array ((1,1), (m,n))           [((i,j), f i j)  | i <- [1..m], j <- [1..n]]     where (m,n) = dimension p           f i j | i == k    = x*(p!(i,j))                 | otherwise = p!(i,j) -- --------------------------------------------------------------------- -- Ejercicio 23. Definir la función --    sumaFilaFila :: Num a => Int -> Int -> Matriz a -> Matriz a -- tal que (sumaFilaFila k l p) es la matriz obtenida sumando la fila l -- a la fila k d la matriz p. Por ejemplo, --    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]] --    ghci> matrizLista (sumaFilaFila 2 3 p) --    [[5,1,0],[7,8,15],[4,6,9]] -- --------------------------------------------------------------------- sumaFilaFila :: Num a => Int -> Int -> Matriz a -> Matriz a sumaFilaFila k l p =      array ((1,1), (m,n))           [((i,j), f i j) | i <- [1..m], j <- [1..n]]     where (m,n) = dimension p           f i j | i == k    = p!(i,j) + p!(l,j)                 | otherwise = p!(i,j)         -- --------------------------------------------------------------------- -- Ejercicio 24. Definir la función --    sumaFilaPor :: Num a => Int -> Int -> a -> Matriz a -> Matriz a -- tal que (sumaFilaPor k l x p) es la matriz obtenida sumando a la fila -- k de la matriz p la fila l multiplicada por x. Por ejemplo, --    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]] --    ghci> matrizLista (sumaFilaPor 2 3 10 p) --    [[5,1,0],[43,62,96],[4,6,9]] -- --------------------------------------------------------------------- sumaFilaPor :: Num a => Int -> Int -> a -> Matriz a -> Matriz a sumaFilaPor k l x p =      array ((1,1), (m,n))           [((i,j), f i j) | i <- [1..m], j <- [1..n]]     where (m,n) = dimension p           f i j | i == k    = p!(i,j) + x*p!(l,j)                 | otherwise = p!(i,j) -- --------------------------------------------------------------------- -- Triangularización de matrices                                      -- -- --------------------------------------------------------------------- -- --------------------------------------------------------------------- -- Ejercicio 25. Definir la función --    buscaIndiceDesde :: (Num a, Eq a) =>  --                        Matriz a -> Int -> Int -> Maybe Int -- tal que (buscaIndiceDesde p j i) es el menor índice k, mayor o igual -- que i, tal que el elemento de la matriz p en la posición (k,j) es no -- nulo. Por ejemplo, --    ghci> let p = listaMatriz [[5,1,0],[3,2,6],[4,6,9]] --    ghci> buscaIndiceDesde p 3 2 --    Just 2 --    ghci> let q = listaMatriz [[5,1,1],[3,2,0],[4,6,0]] --    ghci> buscaIndiceDesde q 3 2 --    Nothing -- --------------------------------------------------------------------- buscaIndiceDesde :: (Num a, Eq a) => Matriz a -> Int -> Int -> Maybe Int buscaIndiceDesde p j i      | null xs   = Nothing     | otherwise = Just (head xs)     where xs = [k | ((k,j'),y) <- assocs p, j == j', y /= 0, k>=i]  |