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] |