Я использую Java HashMap в MATLAB
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 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));
Вам необходимо убедиться, что данные, переданные из 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 и новее есть класс container.Map, который обеспечивает функциональность, подобную HashMap, для собственных типов данных Matlab, поэтому они будут работать со структурами, ячейками, определяемыми пользователем объектами 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
Правильно, это не так. Это решение только в том случае, если вы хотите использовать все типы данных Matlab вместо Java Map и избежать сложностей преобразования Java-to-Matlab. Если вам нужно взаимодействовать с другим кодом Java, который принимает Map, это не сработает.
Но насколько я могу судить, они не подходят в качестве аргументов для параметра Java
Map<>?