8

我在 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'.




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

4

3 回答 3

7

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

MATLAB 将大多数数据视为按值传递(具有句柄语义的类除外),并且似乎没有办法将结构包装在 Java 接口中。但是您可以使用另一个 HashMap 来充当结构,并将 MATLAB 结构转换为 HashMap(对于多级结构、函数句柄和其他不能很好地与 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}

>>

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

于 2009-01-12T23:02:48.843 回答
5

Matlab R2008b 和更新版本有一个containers.Map 类,它在本机Matlab 数据类型上提供类似HashMap 的功能,因此它们可以处理结构、单元、用户定义的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
于 2010-03-02T18:07:21.577 回答
1

我不熟悉 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));
于 2009-01-12T20:40:27.867 回答