Хранение структур MATLAB в объектах Java

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




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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
8
0
8 543
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я не знаком с 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

Но насколько я могу судить, они не подходят в качестве аргументов для параметра Java Map<>?

glglgl 20.02.2015 16:21

Правильно, это не так. Это решение только в том случае, если вы хотите использовать все типы данных Matlab вместо Java Map и избежать сложностей преобразования Java-to-Matlab. Если вам нужно взаимодействовать с другим кодом Java, который принимает Map, это не сработает.

Andrew Janke 21.02.2015 00:58

Другие вопросы по теме