+ Responder tema
Resultados 1 al 2 de 2

Tema: Matrices en Haskell

  1. #1
    Chana
    Guest

    Matrices en Haskell

    Hola.

    Estoy haciendome una especie de "biblioteca" para trabajar con matrices en Haskell. La verdad es que le estoy cojiendo el gustillo a esto bastante. Tengo algunas funciones para multiplicar matrices, sumar, restar, calcular determinante todo en general de orden nxn, por si a alguien le interesa, puede preguntarme.

    Una de las funciones que he conseguido hacer es, "esDiagonal" que te dice si una matriz es diagonal o no (vaya cosa pensareis.. ).
    Esta me ocupa casi media pantalla, usando muchas funciones auxiliares. Sin embargo, tengo un ejercicio que me pide resolver ese mismo problema usando la función all.

    ¿A alguien se le ocurre cómo podría enfocarlo?

    Es decir, escribir una funcion: esDiagonal:: Matriz->Bool que te diga si la matriz que se le pasa por parámetro es o no es diagonal. Pero hay que usar la función all:

    Código:
    all :: (a->Bool)->[a]->Bool
    all p xs = and (map p xs)
    El tipo que uso para manejar matrices :

    Código:
    type Vector = [Float]
    type Matriz = [Vector]
    Agradezco cualquier ayuda.

    Saludos.

  2. #2
    Chana
    Guest

    Matrices en Haskell

    Hola.

    Bueno, al final conseguí sacarlo, pero a falta de tiempo por exámenes y como nadie me lo pidió decidí esperar a que acabaran los exámenes. He echo algo así:

    Código:
    type Fila = [Float]
    type Matriz = [Fila]
    
    esDiagonal :: Matriz -> Bool
    esDiagonal zss= (all (/=0) xss) && (all(==0) yss)
      where         
        xss = noDiagonal zss
        yss = diagonal zss
    
    diagonal :: Matriz -> Fila
    diagonal xss
      |esCuadrada xss = (map p (lista xss))
      |otherwise = error"matriz no cuadrada"
      where
        lista xss = zip [0..] xss
        p (x, xs) = xs!!x
    
    
    noDiagonal :: Matriz -> Fila
    noDiagonal xss
      |esCuadrada xss = concat(map p (lista xss))
      |otherwise = error"matriz no cuadrada"
      where
        lista xss = zip [0..] xss
        p (x, xs) = delete x xs
    
    
    esCuadrada :: Matriz -> Bool
    esCuadrada xss = all(\ xs -> length xs==d) xss
      where 
        d=length xss
    
    delete 0 (z:zs) = zs
    delete x (z:zs) = z:(delete (x-1) zs)
    Sé que es un tocho bueno, pero la idea está en 3 lineas

    Saludos.

+ Responder tema

Temas similares

  1. Respuestas: 2
    Último mensaje: 02/02/2011, 10:44
  2. Partes de una lista. Haskell.
    Por Chana en el foro Informática
    Respuestas: 7
    Último mensaje: 06/01/2009, 20:22
  3. Instancias en Haskell.
    Por Chana en el foro Informática
    Respuestas: 6
    Último mensaje: 03/01/2009, 14:59
  4. Aproximacion de funciones. Haskell.
    Por Chana en el foro Informática
    Respuestas: 16
    Último mensaje: 30/12/2008, 02:26
  5. Convertir matrices reales en matrices complejas 2x2
    Por Quanto en el foro Matemáticas
    Respuestas: 1
    Último mensaje: 30/04/2006, 14:25

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes