在Java对象中存储MATLAB结构

我在MATLAB中使用Java HashMap

h = java.util.HashMap; 

虽然字符串,数组和矩阵与它无关

 h.put(5, 'test'); h.put(7, magic(4)); 

结构没有

 h=java.util.HashMap; st.val = 7; h.put(7, st); ??? No method 'put' with matching signature found for class 'java.util.HashMap'. 

什么是使它适用于结构的最简单/最优雅的方法?

您需要确保可以正确转换从MATLAB传递到Java的数据。 请参阅MATLAB的外部接口文档 ,了解哪些类型转换为其他类型的转换矩阵。

MATLAB将大多数数据视为按值传递(除了具有句柄语义的类),并且似乎没有办法将结构包装在Java接口中。 但是你可以使用另一个HashMap来像一个结构,并将MATLAB结构转换为HashMaps(对多级结构,函数句柄,+其他与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 

一个可能的用例:

 >> 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} >> 

(读者的练习:对于结构成员本身是结构,将其更改为递归工作)

Matlab R2008b和更新版本有一个containers.Map类,它在原生Matlab数据类型上提供类似HashMap的function,因此它们可以处理结构,单元格,用户定义的Matlab对象等。

 % 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 

我不熟悉Java HashMaps,但您是否可以尝试使用单元格数组来存储数据而不是结构?

 h = java.util.HashMap; carr = {7, 'hello'}; h.put(7, carr); % OR h = java.util.HashMap; st.val = 7; h.put(7, struct2cell(st));