2009-01-12 15 views
8

estoy usando Java HashMap en MATLABestructuras Almacenamiento de MATLAB en objetos Java

h = java.util.HashMap; 

Y mientras cadenas, matrices y matrices trabaja abierto con menú con ella

h.put(5, 'test'); 

h.put(7, magic(4)); 

Las estructuras No

h=java.util.HashMap; 
st.val = 7; 
h.put(7, st); 

??? No method 'put' with matching signature found for class 'java.util.HashMap'. 




¿Cuál sería la forma más fácil/más elegante de hacerlo funcionar para las estructuras?

Respuesta

7

Debe asegurarse de que los datos pasados ​​de MATLAB a Java se puedan convertir correctamente. Vea MATLAB External Interfaces document para la matriz de conversión de qué tipos se convierten a qué otros tipos.

MATLAB trata la mayoría de los datos como pasa-por-valor (con la excepción de las clases con semántica de manejador), y no parece haber una manera de ajustar una estructura en una interfaz Java. Pero podría usar otro HashMap para actuar como una estructura y convertir estructuras MATLAB en HashMaps (con una advertencia obvia para estructuras de múltiples niveles, manejadores de funciones, + otras bestias que no funcionan bien con el proceso de conversión de datos MATLAB/Java) .

function hmap = struct2hashmap(S) 
if ((~isstruct(S)) || (numel(S) ~= 1)) 
    error('struct2hashmap:invalid','%s',... 
      'struct2hashmap only accepts single structures'); 
end 

hmap = java.util.HashMap; 
for fn = fieldnames(S)' 
    % fn iterates through the field names of S 
    % fn is a 1x1 cell array 
    fn = fn{1}; 
    hmap.put(fn,getfield(S,fn)); 
end 

un posible caso de uso:

>> M = java.util.HashMap; 
>> M.put(1,'a'); 
>> M.put(2,33); 
>> s = struct('a',37,'b',4,'c','bingo') 

s = 

    a: 37 
    b: 4 
    c: 'bingo' 

>> M.put(3,struct2hashmap(s)); 
>> M 

M = 

{3.0={a=37.0, c=bingo, b=4.0}, 1.0=a, 2.0=33.0} 

>> 

(un ejercicio para el lector: cambiar esto a trabajar de forma recursiva para miembros de la estructura que en sí son estructuras)

1

No estoy familiarizado con Java HashMaps, pero ¿podría intentar usar una matriz de celdas para almacenar los datos en lugar de una estructura?

h = java.util.HashMap; 
carr = {7, 'hello'}; 
h.put(7, carr); 

% OR 

h = java.util.HashMap; 
st.val = 7; 
h.put(7, struct2cell(st)); 
5

Matlab R2008b y más nuevos tienen una contenedores Clase .Map que proporciona funcionalidad similar a HashMap en tipos de datos Matlab nativos, por lo que trabajarán con estructuras, celdas, objetos Matlab definidos por el usuario, y más.

% Must initialize with a dummy value to allow numeric keys 
m = containers.Map(0, 0, 'uniformValues',false); 
% Remove dummy entry 
m.remove(0); 

m(5) = 'test'; 
m(7) = magic(4); 
m(9) = struct('foo',42, 'bar',1:3); 
m(5), m(7), m(9) % get values back out 
+0

Pero, por lo que puedo decir, no son apropiados como argumentos para un parámetro Java 'Map <>'? – glglgl

+0

Correcto, no lo son. Esta es solo una solución si desea ir con todos los tipos de datos Matlab en lugar de Java 'Map', y evitar las complejidades de la conversión de Java a Matlab. Si necesita interoperar con otro código Java que toma un 'Mapa', esto no funcionará. –

Cuestiones relacionadas