tipos relativa poligono interpretacion histogramas histograma hacer frecuencia español ejemplos ejemplo datos con como c++ c algorithm matlab histogram

relativa - stl c++ español



Búsqueda de un algoritmo de histograma rápido/eficiente(con contenedores preespecificados) (3)

El algoritmo de histograma "ideal" dependerá del rango que espere capturar. En general, cualquier algoritmo de histograma se verá así:

const int NSAMPLES = whatever; double samples[NSAMPLES] = { 1.0, 3.93, 1e30, ... }; // your data set const int NBUCKETS = 10; // or whatever int counts[NBUCKETS] = { 0 }; for (int i = 0; i != NSAMPLES; ++i) { counts[TRANSFER(samples[i])]++; }

donde TRANSFER() es una función que asigna sus entradas a un contenedor (asignación de bandeja 0 ° o N ° a "fuera de rango" aplicable).

La implementación exacta de TRANSFER() depende en gran medida de la distribución esperada de su muestra y de dónde le interesan los detalles. Algunos enfoques comunes que he visto:

  • distribución uniforme en el rango [a, b] (requiere una transformación lineal)
  • distribución logarítmica de valores enteros sin signo (mejor cuando se combina con algunos hacks de twiddling para determinar rápidamente la potencia de dos más cercana o similar).

Si no conoce la distribución por adelantado, entonces realmente no puede tener un mecanismo eficiente para almacenarlos de manera efectiva: tendrá que adivinar (resultados parciales o no informativos) o almacenar todo y ordenarlo al final, binning en cubos de igual tamaño (bajo rendimiento).

No hago mucha codificación fuera de Matlab, pero tengo la necesidad de exportar mi código Matlab a otro idioma, muy probablemente C. Mi código Matlab incluye una función de histograma, histc (), que coloca mis datos de entrada (que es doble -precisión, no entero) en una matriz especificada de contenedores, para formar un histograma.

Estoy seguro de que puedo juntar un par de bucles anidados para generar una función de histograma, pero necesito que esta función sea rápida y ligera como la memoria, ya que se accederá a ella repetidas veces.

Para evitar reinventar la rueda, ¿alguien sabe si el lenguaje C tiene alguna función de histograma existente disponible para su uso, o si las personas que necesitan tal cosa generalmente la crean ellos mismos?

¿Alguien conoce un algoritmo eficiente para crear un histograma? El seudocódigo está bien.

Gracias por adelantado.


Escribí mi propio código de histograma en C, ya que es bastante simple que ni siquiera pensé buscar una biblioteca. Normalmente solo necesitas crear una matriz para contener la cantidad de bandejas que quieras [ num_bins = (int)(val_max - val_min + 1); ], y al encontrar cada muestra, puede dividir por el número de contenedores [ bin_idx = (int)((value - val_min) / bin_width); ] (donde bin_width = (max-min)/num_bins ) para encontrar su lugar y luego incrementar el contador de contenedores. Este es un pase sencillo, rápido y sencillo a través de los datos. Verifique mi aritmética anterior para casos extremos.

El problema que puede encontrar es que el dominio de su entrada puede no ser conocido. Tener 100 contenedores en todo el rango de double no va a ser muy bueno si todos tus datos están dentro de una pequeña fracción de eso. La solución es hacer una primera pasada sobre los datos para encontrar el mínimo / máximo de su rango. Realmente no hay una solución rápida a esto y la mayoría de las bibliotecas pedirá un mínimo / máximo por adelantado.