【问题标题】:Storing MATLAB structs in Java objects在 Java 对象中存储 MATLAB 结构
【发布时间】:2010-10-01 00:19:13
【问题描述】:

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




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

【问题讨论】:

    标签: java matlab hashmap


    【解决方案1】:

    您需要确保从 MATLAB 传递到 Java 的数据可以正确转换。请参阅 MATLAB 的 External Interfaces document 了解哪些类型转换为哪些其他类型的转换矩阵。

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

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

    【讨论】:

      【解决方案2】:

      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
      

      【讨论】:

      • 但据我所知,它们不适合作为 Java Map<> 参数的参数?
      • 正确,它们不是。如果您想使用所有 Matlab 数据类型而不是 Java Map,并且避免 Java 到 Matlab 转换的复杂性,这只是一个解决方案。如果您需要与采用 Map 的其他 Java 代码进行互操作,这将不起作用。
      【解决方案3】:

      我对 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));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 2015-12-04
        • 2018-06-15
        • 2011-05-03
        • 2016-07-08
        相关资源
        最近更新 更多