¿Cómo obtengo una submatriz en Haskell?Tomando sub-arrays en Haskell
Respuesta
Creo que estás buscando es la sección 'matrices derivadas' en la documentación Data.Array: http://hackage.haskell.org/packages/archive/array/latest/doc/html/Data-Array.html#5 que alberga la función:
ixmap :: (Ix i, Ix j) => (i, i) -> (i -> j) -> Matriz je -> Matriz ie
ixmap permite transformaciones en índices de matriz. Se puede pensar que proporciona composición de funciones a la derecha con el mapeo que encarna la matriz original.
Se puede lograr una transformación similar de los valores de matriz utilizando fmap desde la instancia Array> de la clase Functor.
el siguiente código:
ixmap newBounds trans backingArray
habría devolver una matriz con límites newBounds
, y cuando indexadas con !i
, la función de transformación índice se aplica sobre el índice de i
antes de ser utilizado para indexar backingArray
.
Ejemplo si tuviera la matriz "Hello World" (helloWorldArray abajo) y sólo desea ver "codo" como base cero (sub) serie derivada:
> let helloWorldArray = listArray (0,length str - 1) str -- 0-based array
where str = "Hello World"
> let ellArray = ixmap (0,2) succ helloWorldArray -- also 0-based array
> ellArray ! 0
'e'
> ellArray ! 1
'l'
> ellArray ! 2
'l'
Aquí decimos que nuestra nueva matriz ellArray
tiene índices desde 0
hasta 2
. Nuestra transformación de índice es simplemente para agregar uno (succ
), porque queremos asignar el rango de índice [0..2]
a [1..3]
en el helloWorldArray
original.
Por supuesto, ixmap
es lo suficientemente abstracto como para capturar cualquier transformación de índice: incluso para ver 2 matrices dimensionales como matrices de 1 dimensión y viceversa. Es mejor pensar en ello como crear una 'vista' en datos de matriz en lugar de que en una función 'sub-matriz'.
Para más ejemplos que usted puede buscar aquí: http://zvon.org/other/haskell/Outputarray/ixmap_f.html
No encontré ninguna forma directa de obtener una sub-matriz (es decir, una división), pero esta es una forma de hacerlo a través de una lista intermedia.
import Data.Array
subArray :: Int -> Int -> Array -> Array
subArray i j a = listArray (0,j-i) $ map (a!) [i..j]
Tomando sub-arrays utilizando el paquete vector es probablemente el método más sencillo (asumiendo que su pregunta no es en realidad preguntando acerca de tomar sub-listas).
Las funciones relevantes de la interfaz de vectores en general/matriz es:
- slice
:: Vector v a => Int -> Int -> v a -> v a
pero también debe saber acerca de tomar y soltar. slice toma un índice y una longitud, y extrae la sub-matriz.
- 1. ¿Cuál es la diferencia entre boost :: multi_array vistas y subarrays
- 2. XSL Tomando XML transformándolo en Excel
- 3. heroku deploy tomando muy largo
- 4. Tomando una foto y geoetiquetándola
- 5. Django - tomando valores de petición POST
- 6. ¿Estás tomando Perl y qué te atrapó?
- 7. Tomando computación pesada del Android UI Thread
- 8. Regex tomando un tiempo sorprendentemente largo
- 9. ResultSet - Cursor: rs.next() Tomando mucho tiempo
- 10. Eliminar de la tabla vacía tomando forver
- 11. C++ STL vector: push_back tomando como referencia
- 12. en Haskell
- 13. Escribir un intérprete Haskell en Haskell
- 14. Tomando un curso de montaje, ¡atascado en DOS!
- 15. tomando la intersección de N-many listas en python
- 16. Futuros en Haskell
- 17. instalando dependencias en haskell
- 18. Mapas infinitos en Haskell
- 19. valores absolutos en Haskell
- 20. ¿Doble mapa en haskell?
- 21. Parse XML en Haskell
- 22. funciones externas en haskell?
- 23. 'Repetir' en Haskell?
- 24. Catamorphism y en Haskell
- 25. ¿Qué significa ': ..' en Haskell?
- 26. Variables en Haskell
- 27. Cierres (en Haskell)
- 28. Sin puntos en Haskell
- 29. Cola eficiente en Haskell
- 30. autorreferencia en Haskell funciona
¿Sabes cómo obtener una matriz en primer lugar? ¿De qué biblioteca de arreglos estás hablando? Data.Vector? Data.Array? Esta pregunta realmente necesita desarrollarse. –
@TomMD subArray of Data.Array – Rnet
Data.Array es bastante torpe y no tiene fusión, le sugiero que busque Data.Vector para futuras necesidades de matriz. –