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 構造体を 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}

>>

(読者のための演習: これを変更して、それ自体が構造体である構造体メンバーに対して再帰的に機能するようにします)

于 2009-01-12T23:02:48.843 に答える
5

Matlab R2008b 以降には、ネイティブの Matlab データ型で HashMap のような機能を提供する container.Map クラスがあるため、構造体、セル、ユーザー定義の 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 に答える