Хранение структур MATLAB в объектах Java - PullRequest
8 голосов
/ 12 января 2009

Я использую 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'.




Какой самый простой / изящный способ заставить его работать на структуры?

Ответы [ 3 ]

7 голосов
/ 13 января 2009

Вы должны убедиться, что данные, передаваемые из 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}

>>

(упражнение для читателя: измените это на рекурсивную работу для элементов конструкции, которые сами являются структурами)

5 голосов
/ 02 марта 2010

Matlab R2008b и новее имеют контейнер Containers.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
1 голос
/ 12 января 2009

Я не знаком с 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...