¿MATLAB tiene algún soporte para tablas hash?
Algunos antecedentes
Estoy trabajando en un problema en Matlab que requiere una representación en el espacio de escala de una imagen. Para hacer esto, creo un filtro gaussiano 2-D con variación sigma*s^k
para k
en algún rango, y luego uso cada uno a su vez para filtrar la imagen. Ahora, quiero algún tipo de mapeo de k
la imagen filtrada.
Si k
siempre fuera un número entero, simplemente crearía una matriz 3D tal que:
arr[k] = <image filtered with k-th guassian>
Sin embargo, k
no es necesariamente un número entero, por lo que no puedo hacer esto. Lo que pensé en hacer fue mantener una serie de k
s tales que:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
Lo que parece bastante bueno a primera vista, excepto que haré esta búsqueda potencialmente unos miles de veces con aproximadamente 20 o 30 valores de k
, y me temo que esto afectará el rendimiento.
Me pregunto si no me serviría mejor haciendo 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 prematuramente, y es posible que no tenga este problema en absoluto, pero recuerde, esto es solo el fondo, y puede haber casos en los que esta sea realmente la mejor solución, independientemente de si es el la mejor solución para mi problema.
Los nuevos contenedores de Matlab R2008b (7.7). La clase Map es una versión Matlab reducida de la interfaz java.util.Map . Tiene el beneficio adicional de una integración perfecta con todos los tipos de Matlab ( Java Maps no puede manejar 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 amplia, si no al rendimiento. Las versiones de Matlab anteriores a R2008b no tienen alternativa real en ningún caso y deben usar las clases de Java.
Una posible limitación del uso de colecciones de Java es su incapacidad para contener tipos de 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 estar interesado en examinar una implementación Hashtable puramente orientada a objetos (basada en clases) de Matlab, que está disponible en File Exchange .
fuente
Podrías usar java para ello.
En matlab:
Pero tendrías que hacer algunos perfiles para ver si te da una ganancia de velocidad, supongo ...
fuente
Es un poco complicado, pero me sorprende que nadie haya sugerido el uso de estructuras. Puede acceder a cualquier campo de estructura por nombre de variable, ya que
struct.(var)
dóndevar
puede estar cualquier variable y se resolverá adecuadamente.fuente
dict.('2')
:: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…dict.(['k',num2str(1)])
funciona, perodict.(['k',num2str(1.1)])
falla, y si los valores son enteros, puedes usarlos para indexar directamente. De lo contrario, es una buena idea..
con una_
.dict.(genvarname(['k',num2str(1.1)]))
También puede aprovechar el nuevo tipo "Tabla". Puede almacenar diferentes tipos de datos y obtener estadísticas de forma muy fácil. Consulte http://www.mathworks.com/help/matlab/tables.html para obtener más información.
fuente