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




使它对结构有效的最简单/最优雅的方法是什么?

杰森S:

您需要确保可以正确转换从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}

>>

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章