Menu Close

Operaciones binarias con matrices

Entre dos matrices de la misma dimensión se pueden aplicar distintas operaciones binarias entre los elementos en la misma posición. Por ejemplo, si a y b son las matrices

   |3 4 6|     |1 4 2|
   |5 6 7|     |2 1 2|

entonces a+b y a-b son, respectivamente

   |4 8 8|     |2 0 4|
   |7 7 9|     |3 5 5

Definir la función

   opMatriz :: (Int -> Int -> Int) -> 
               Matriz Int -> Matriz Int -> Matriz Int

tal que (opMatriz f p q) es la matriz obtenida aplicando la operación f entre los elementos de p y q de la misma posición. Por ejemplo,

   λ> a = listArray ((1,1),(2,3)) [3,4,6,5,6,7]
   λ> b = listArray ((1,1),(2,3)) [1,4,2,2,1,2]
   λ> elems (opMatriz (+) a b)
   [4,8,8,7,7,9]
   λ> elems (opMatriz max a b)
   [3,4,6,5,6,7]
   λ> c = listArray ((1,1),(2,2)) ["ab","c","d","ef"]
   λ> d = listArray ((1,1),(2,2)) [3,1,0,5]
   λ> elems (opMatriz menor c d)
   [True,False,False,True]

Soluciones

import Data.Array
 
-- 1ª solución
opMatriz :: (a -> b -> c) ->
            Array (Int,Int) a -> Array (Int,Int) b -> Array (Int,Int) c
opMatriz f p q =
  array (bounds p) [(k, f (p!k) (q!k)) | k <- indices p]
 
-- 2ª solución
opMatriz2 :: (a -> b -> c) ->
            Array (Int,Int) a -> Array (Int,Int) b -> Array (Int,Int) c
opMatriz2 f p q = 
  listArray (bounds p) [f x y | (x,y) <- zip (elems p) (elems q)]
 
-- 3ª solución
opMatriz3 :: (a -> b -> c) ->
            Array (Int,Int) a -> Array (Int,Int) b -> Array (Int,Int) c
opMatriz3 f p q = 
  listArray (bounds p) (zipWith f (elems p) (elems q))
Inicial

3 soluciones de “Operaciones binarias con matrices

  1. alerodrod5
     
    import Data.Array
    type Matriz a = Array (Int,Int) a
    opMatriz :: (Int -> Int -> Int) ->  Matriz Int -> Matriz Int -> Matriz Int
    opMatriz f a b = array ((1,1),(m,n)) [((i,j),f (a!(i,j)) (b!(i,j)))
                                            | i <- [1..m],j <- [1..n]]
       where (m,n) = (snd.bounds) a
  2. albcarcas1
    import Data.Array
     
    type Matriz a = Array (Int,Int) a
     
    opMatriz :: (Int -> Int -> Int) -> Matriz Int -> Matriz Int -> Matriz Int
    opMatriz f a b = listArray ((1,1),(m,n)) (zipWith f (elems a) (elems b))
      where (m,n) = snd(bounds a)
  3. angruicam1
    import Data.Array (Array, listArray, elems, accum, assocs)
     
    type Matriz a = Array (Int,Int) a
     
    opMatriz :: (Int -> Int -> Int) -> 
                Matriz Int -> Matriz Int -> Matriz Int
    opMatriz f p q = accum f p (assocs q)

    Y la versión sin argumentos:

    opMatriz :: (Int -> Int -> Int) -> 
                Matriz Int -> Matriz Int -> Matriz Int
    opMatriz = flip (flip . flip (flip . flip accum) . assocs)

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.