O MATLAB tem suporte para tabelas de hash?
Alguns antecedentes
Estou trabalhando em um problema no Matlab que requer uma representação de escala no espaço de uma imagem. Para fazer isso eu criar um filtro 2-D Gaussian com variância sigma*s^k
para k
em algum intervalo., E então eu uso um de cada vez para filtrar a imagem. Agora, quero algum tipo de mapeamento da k
imagem filtrada.
Se k
fosse sempre um número inteiro, eu simplesmente criaria uma matriz 3D de modo que:
arr[k] = <image filtered with k-th guassian>
No entanto, k
não é necessariamente um número inteiro, então não posso fazer isso. O que pensei em fazer foi manter uma série de k
s tais que:
arr[find(array_of_ks_ = k)] = <image filtered with k-th guassian>
O que parece muito bom à primeira vista, exceto que estarei fazendo essa pesquisa potencialmente alguns milhares de vezes com cerca de 20 ou 30 valores de k
, e temo que isso prejudique o desempenho.
Eu me pergunto se eu não ficaria melhor fazendo isso com uma tabela de hash de algum tipo, de modo que eu teria um tempo de pesquisa que é O (1) em vez de O (n).
Bem, eu sei que não devo otimizar prematuramente e posso não ter esse problema, mas lembre-se, isso é apenas o pano de fundo, e pode haver casos em que esta é realmente a melhor solução, independentemente de ser o melhor solução para o meu problema.
A nova classe containers.Map do Matlab R2008b (7.7) é uma versão reduzida do Matlab da interface java.util.Map . Ele tem o benefício adicional de integração contínua com todos os tipos de Matlab ( Java Maps não pode lidar com structs Matlab, por exemplo), bem como a capacidade desde o Matlab 7.10 (R2010a) de especificar tipos de dados .
Implementações sério Matlab que requerem mapas de valor-chave / dicionários ainda deve usar classes Mapa de Java ( java.util.EnumMap , HashMap , TreeMap , LinkedHashMap ou Hashtable ) para ter acesso à sua funcionalidade maior não se desempenho. As versões do Matlab anteriores ao R2008b não têm alternativa real em nenhum caso e devem usar as classes Java.
Uma limitação potencial do uso de coleções Java é sua incapacidade de conter tipos Matlab não primitivos, como structs. Para superar isso, faça down-converter dos tipos (por exemplo, usando struct2cell ou programaticamente) ou crie um objeto Java separado que manterá suas informações e armazenará esse objeto na coleção Java.
Você também pode estar interessado em examinar uma implementação de Hashtable orientada a objeto puro do Matlab (baseada em classe), que está disponível no File Exchange .
fonte
Você pode usar java para isso.
No matlab:
Mas você teria que fazer alguns perfis para ver se isso lhe dá um ganho de velocidade, eu acho ...
fonte
É um pouco complicado, mas estou surpreso que ninguém tenha sugerido o uso de structs. Você pode acessar qualquer campo de estrutura por nome de variável, como
struct.(var)
ondevar
pode ser qualquer variável e resolverá de forma apropriada.fonte
dict.('2')
:: mathworks.com/access/helpdesk/help/techdoc/matlab_prog/…dict.(['k',num2str(1)])
funciona, masdict.(['k',num2str(1.1)])
falha, e se os valores forem inteiros, você pode usá-los para indexar diretamente. Caso contrário, é uma boa ideia..
por um_
.dict.(genvarname(['k',num2str(1.1)]))
Você também pode aproveitar as vantagens do novo tipo "Mesa". Você pode armazenar diferentes tipos de dados e obter estatísticas com facilidade. Consulte http://www.mathworks.com/help/matlab/tables.html para obter mais informações.
fonte