MATLAB構造体をJavaオブジェクトに保存する
質問
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以降には、ネイティブMatlabデータ型でHashMapのような機能を提供するcontainers.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
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));
所属していません StackOverflow