Есть ли уже библиотека / парсер YAML для MATLAB?

Я хочу использовать YAML для передачи данных на нескольких языках. (Думайте об этом как о «независимой от языка сериализации».) Один из этих языков - MATLAB, но я не могу найти библиотеку YAML для этого языка. Я проверил "matlab yaml" и "matlab yaml parse" в Google, и, похоже, не было никаких подходящих результатов. Поиск «yaml» на MATLAB Central также оставил меня с пустыми руками.

Неужели для MATLAB нет существующей библиотеки YAML? Я могу написать одну, но я бы хотел избежать дублирования работы. (Может, чем поделиться?)


person Benjamin Oakes    schedule 28.10.2009    source источник
comment
Почему вы хотите использовать YAML? XML имеет гораздо лучшую межъязыковую поддержку.   -  person Greg Beech    schedule 28.10.2009
comment
Что вы в конечном итоге использовали и как это работало? Я в похожей ситуации и мне было бы интересно услышать.   -  person AndyL    schedule 11.11.2009
comment
Появились и другие высокоприоритетные вещи, так что у меня еще не было возможности попробовать это. Если вы попробуете что-то до того, как это сделаю я (я опубликую), я хотел бы услышать, как это происходит.   -  person Benjamin Oakes    schedule 11.11.2009


Ответы (7)


Я расширил код Jan для поддержки большего количества типов данных, а также для записи из структуры Matlab в файл yaml. Это не просто m-файл, поэтому я нашел источники на http://code.google.com/p/yamlmatlab/ Иржи

person Jirka cigler    schedule 02.03.2011
comment
Я хочу использовать чтение YAML в кластере (-nojvm). Итак, зависимость от java - это не вариант. Есть ли версия MEX? - person Yauhen Yakimovich; 07.08.2013

Вызовите существующие библиотеки импорта Java YAML из Matlab. Это должно быть довольно просто. Совместимость Java-Matlab довольно хорошая, см. Справку по Matlab.

person Mikhail    schedule 28.10.2009
comment
Это отличная идея - даже не подумал об этом. Будут ли типы данных в Java включены в соответствующие типы в Matlab? Никогда особо не возился с Java ... - person Benjamin Oakes; 28.10.2009
comment
Числовые типы преобразуются неявно, строки должны быть преобразованы явно либо с помощью ячейки (myJavaArray) для массивов, либо с помощью char (myJavaString), см. Справку по Matlab, это довольно хорошо по этой теме. - person Mikhail; 28.10.2009
comment
@AndyL, теперь есть оболочка matlab для snakeyaml. - person Marc; 23.06.2011
comment
@AndyL, см. Ответ jirka на этой странице - person Marc; 28.06.2011

Теперь есть оболочка matlab для snakeyaml:

http://code.google.com/p/yamlmatlab/

Я попробовал, и он очень хорошо работает с простым файлом yaml. Есть ошибки, если имена полей yaml не являются допустимыми именами полей и когда строки пусты. Я предложил обходные пути для обоих из них в разделе проблем на сайте кода Google.

person Marc    schedule 23.06.2011
comment
мой плохой, пропущенный ответ Джирки - person Marc; 23.06.2011

Я считаю, что следующий пример поможет сэкономить время.

Сначала вам нужно загрузить документ YAML с помощью змеиного YAML:

javaaddpath C:\temp\snakeyaml-1.7.jar
import('org.yaml.snakeyaml.Yaml')

yamlreader = Yaml();
yml = fileread('C:\temp\test.yml');
jymlobj = yamlreader.load(yml);

и впоследствии вам потребуется доступ к данным из объекта java, я сделал это с помощью следующей процедуры (обратите внимание, что это не общая процедура, и она была разработана для определенного типа файлов YAML, где, например, матрицы определены как в Matlab )

function Data = Hash2Struct(hashMap)

  Data = [];

  iterator = hashMap.keySet().iterator();
  while (iterator.hasNext())
     field = iterator.next();
     if ~isempty(field)
        d =  hashMap.get(field);
        switch class(d)
            case {'java.util.LinkedHashMap'}
                Data.(field) = Hash2Struct(d);
            case {'java.util.ArrayList'}
               Data.(field) = str2num(d.toString);               
            otherwise    
                Data.(field) = d;
        end
     end
  end

Удачи, ян

person Jan    schedule 09.11.2010
comment
Мне пришлось изменить код Яна, чтобы заключить ключ в java.lang.String (), прежде чем hashMap вернет значение, связанное с ключом. Результат метода .get (field) для меня всегда ничего не возвращает. Итак, вы можете попробовать изменить строку: d = hashMap.get (field) на d = hashMap.get (java.lang.String (field)), если у вас есть аналогичная проблема. Это, конечно, предполагает, что ваш keySet имеет тип String. - person ; 09.02.2011

@AndyL Для sankeyaml добавьте его в свой javapath, затем импортируйте ('org.yaml.snakeyaml.Yaml'), и он будет работать как документы; Полученный LinkedHashMap доступен более или менее как структура Matlab.

person natto    schedule 02.02.2010
comment
Вы имели в виду путь к классам под javapath? - person izilotti; 31.12.2012

Также существует реализация MEX Джеффром Адамсом под названием mat-yaml с привязкой C для libyaml парсер-эмиттер).

Но его пока нельзя скомпилировать под Windows.

person Yauhen Yakimovich    schedule 10.08.2013

ZozaniDB Database Toolbox включает встроенную в Matlab реализацию YAML (распространяется как p-файлы).

>> s=yaml_dump(struct('name','apple','calories',53))

  s =

name: apple
calories: 53

>> yaml_parse(s)

ans = 
        name: 'apple'
    calories: 53
person ahmetsacan    schedule 14.03.2015