Tablas Hash en MATLAB
hashtable (6)
¿Tiene MATLAB algún soporte para tablas hash?
Algunos antecedentes
Estoy trabajando en un problema en Matlab que requiere una representación en escala de espacio de una imagen. Para hacer esto, creo un filtro gaussiano 2-D con varianza sigma*s^k
para k
en algún rango. Y luego utilizo cada uno por turno para filtrar la imagen. Ahora, quiero algún tipo de mapeo de k
a la imagen filtrada.
Si k
fuera siempre un número entero, simplemente crearía una matriz tridimensional de tal manera que:
arr[k] = <image filtered with k-th guassian>
Sin embargo, k
no es necesariamente un número entero, así que no puedo hacer esto. Lo que pensé hacer fue mantener una variedad de k
tal que:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Lo cual parece bastante bueno al principio, excepto que haré esta búsqueda potencialmente unos miles de veces con unos 20 o 30 valores de k
, y me temo que esto perjudicará el rendimiento.
Me pregunto si no me sería más útil hacer esto con una tabla hash de algún tipo para tener un tiempo de búsqueda que sea O (1) en lugar de O (n).
Ahora, sé que no debería optimizar de forma prematura, y es posible que no tenga este problema, pero recuerde, esto es solo el fondo, y puede haber casos en los que esta sea realmente la mejor solución, independientemente de si se trata de la La mejor solución para mi problema.
Considere usar la clase de mapa de MATLAB: containers.Map . Aquí hay una breve descripción:
Creación:
>> keys = {''Jan'', ''Feb'', ''Mar'', ''Apr'', ''May'', ''Jun'', ... ''Jul'', ''Aug'', ''Sep'', ''Oct'', ''Nov'', ''Dec'', ''Annual''}; >> values = {327.2, 368.2, 197.6, 178.4, 100.0, 69.9, ... 32.3, 37.3, 19.0, 37.0, 73.2, 110.9, 1551.0}; >> rainfallMap = containers.Map(keys, values) rainfallMap = containers.Map handle Package: containers Properties: Count: 13 KeyType: ''char'' ValueType: ''double'' Methods, Events, Superclasses
Buscar:
x = rainfallMap(''Jan'');
Asignar:
rainfallMap(''Jan'') = 0;
Añadir:
rainfallMap(''Total'') = 999;
Retirar:
rainfallMap.remove(''Total'')
Inspeccionar:
values = rainfallMap.values; keys = rainfallMap.keys; sz = rainfallMap.size;
Tecla de verificación:
if rainfallMap.isKey(''Today'') ... end
Es un poco clueco, pero estoy sorprendido de que nadie haya sugerido usar estructuras. Puede acceder a cualquier campo de estructura por nombre de variable como struct.(var)
donde var
puede ser cualquier variable y se resolverá adecuadamente.
dict.a = 1;
dict.b = 2;
var = ''a'';
display( dict.(var) ); % prints 1
Matlab no tiene soporte para hashtables. EDITAR Hasta r2010a, eso es; ver la respuesta de @Amro
Para acelerar sus búsquedas, puede soltar el find
y usar ÍNDICE LÓGICO .
arr{array_of_ks==k} = <image filtered with k-th Gaussian>
o
arr(:,:,array_of_ks==k) = <image filtered with k-th Gaussian>
Sin embargo, en toda mi experiencia con Matlab, nunca he tenido que buscar un cuello de botella.
Para acelerar su problema específico, sugiero usar filtros incrementales
arr{i} = GaussFilter(arr{i-1},sigma*s^(array_of_ks(i)) - sigma*s^(array_of_ks(i-1)))
asumiendo que array_of_ks
está ordenado en orden ascendente, y GaussFilter calcula el tamaño de máscara de filtro según la varianza (y utiliza, 2 filtros 1D, por supuesto), o puede filtrar en Fourier Space, que es especialmente útil para imágenes grandes y si las varianzas están espaciados de manera uniforme (lo cual es muy probable que no desafortunadamente).
Nuevos contenedores de Matlab R2008b (7.7). La clase de mapa es una versión reducida de Matlab de la interfaz java.util.Map . Tiene la ventaja añadida de una integración perfecta con todos los tipos de Matlab ( Java Maps no puede manejar las estructuras de Matlab, por ejemplo), así como la capacidad desde Matlab 7.10 (R2010a) para especificar tipos de datos .
Las implementaciones serias de Matlab que requieren mapas / diccionarios de valores clave aún deben usar las clases de mapas de Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap o Hashtable ) para obtener acceso a su funcionalidad más grande si no es el rendimiento. Las versiones de Matlab anteriores a R2008b no tienen una alternativa real en ningún caso y deben usar las clases de Java.
Una posible limitación del uso de Colecciones Java es su incapacidad para contener tipos Matlab no primitivos, como estructuras. Para superar esto, convierta los tipos (por ejemplo, usando struct2cell o programáticamente), o cree un objeto Java separado que contendrá su información y almacenará este objeto en la Colección Java.
También puede interesarle examinar una implementación de tabla Hashtable pura-Matlab orientada a objetos (basada en clases), que está disponible en File Exchange .
Podría usar java para eso.
En matlab:
dict = java.util.Hashtable;
dict.put(''a'', 1);
dict.put(''b'', 2);
dict.put(''c'', 3);
dict.get(''b'')
Pero tendrías que hacer algunos perfiles para ver si te da un aumento de velocidad, supongo ...
También puede aprovechar el nuevo tipo "Tabla". Puede almacenar diferentes tipos de datos y obtener estadísticas realmente fáciles. Consulte http://www.mathworks.com/help/matlab/tables.html para obtener más información.