2009-11-02 19 views
8

La documentación en el módulo Bigarray es algo vaga. Establece que el propósito de las matrices en ese módulo es mantener "matrices grandes", pero realmente no define lo que significa "matriz grande". ¿Cuándo debería usar un Bigarray en una matriz regular? ¿Hay una cierta cantidad de elementos más allá de los cuales debería usar un Bigarray? ¿Está en los miles? Millones? Miles de millones?¿Cuándo necesito usar un Bigarray y por qué?

¿Y qué hace que un Bigarray sea mejor para tratar arreglos grandes? ¿Qué hace que una matriz regular sea mejor para tratar con ... arreglos no grandes?

+2

Puede ser que esté definiendo una "gran matriz" como una "matriz dispersa", aunque no conozco completamente OCaml, por lo que podría quedarme mudo aquí. –

+0

Incluso en ese caso, ¿por qué necesitaría una estructura de datos diferente? –

+1

Una matriz dispersa no mantiene (necesariamente) un espacio en la memoria, o incluso un puntero a 'null' para cada elemento de la matriz. Si tiene una matriz de 2 mil millones de elementos como sugiere en su pregunta, ese valor es de aproximadamente 8 GB, puramente en indicadores. Sin embargo, si solo tienes 5 elementos en la matriz (presumiblemente en índices altos), entonces tu espacio de almacenamiento solo necesita contener 5 punteros y ocupar un puñado de bytes. –

Respuesta

10

he encontrado la respuesta a esta (de this page):

La biblioteca bigarray implementa multidimensionales, matrices grandes y numéricos. Estas matrices se denominan "matrices grandes" para distinguirlas de las matrices estándar Caml descritas en la matriz de módulos. Las principales diferencias entre “grandes arrays” y arrays Caml estándar son como sigue:

  • grandes matrices no están limitados en tamaño, a diferencia de arrays Caml (array flotador se limitan a 2.097.151 elementos en una plataforma de 32 bits, otra matriz tipos a 4194303 elementos).
  • Las matrices grandes son multidimensionales. Se admite cualquier cantidad de dimensiones entre 1 y 16. Por el contrario, las matrices Caml son mono-dimensionales y requieren la codificación de matrices multidimensionales como matrices de matrices.
  • Las grandes matrices solo pueden contener números enteros y números de coma flotante, mientras que las matrices Caml pueden contener tipos de datos Caml arbitrarios. Sin embargo, las matrices grandes proporcionan un almacenamiento más eficiente en espacio de elementos enteros y de punto flotante, en particular porque admiten tipos "pequeños" como flotantes de precisión simple y enteros de 8 y 16 bits, además de los tipos de Caml estándar de doble - flotantes de precisión y enteros de 32 y 64 bits.
  • El diseño de la memoria de las matrices grandes es totalmente compatible con las matrices en C y Fortran, lo que permite que las matrices grandes pasen entre el código Caml y el código C/Fortran sin copiar datos en absoluto.
  • Las grandes matrices soportan operaciones interesantes de alto nivel que las matrices normales no proporcionan de manera eficiente, como la extracción de sub-arrays y el "corte" de una matriz multidimensional a lo largo de ciertas dimensiones, todo sin ninguna copia.
+0

La compatibilidad con C/Fortran es el gran caso que veo para bigarrays. Puede reducir drásticamente el uso de memoria cuando interactúa con bibliotecas basadas en arreglos de C o Fortran (por ejemplo, BLAS). –

+0

El límite de tamaño es de 16Mb y afecta a matrices flotantes, matrices en línea y cadenas (que son matrices de bytes). Las matrices grandes se usan para permitir matrices grandes en plataformas de 32 bits. Lo mejor es usar una plataforma de 64 bits y olvidarse de las grandes matrices ... –

Cuestiones relacionadas