2009-10-28 3 views
7

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

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

+1

Почему вы хотите использовать YAML? XML имеет гораздо лучшую поддержку на разных языках. –

+1

Что вы в конечном итоге использовали и как это работает? Я в подобной ситуации, и мне будет интересно услышать. – AndyL

+0

Некоторые другие высокоприоритетные вещи появились, поэтому у меня еще не было возможности попробовать это. Если вы попробуете что-нибудь, прежде чем я сделаю (я отправлю), я хотел бы услышать о том, как это происходит. –

ответ

6

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

+0

Я хочу использовать прочитанный YAML на кластере (-nojvm). Таким образом, зависимость java не является вариантом. Есть ли версия MEX? –

3

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

+0

Это отличная идея - даже не подумал об этом. Будут ли типы данных в Java скрыты в соответствующих типах в Matlab? Никогда не испортил материал Java ... –

+0

Числовые типы преобразуются неявно, строки должны быть явно конвертированы с ячейкой (myJavaArray) для массивов или char (myJavaString), см. Справку Matlab, это довольно хорошо по этой теме. – Mikhail

+3

Посмотрите на SnakeYAML (http://code.google.com/p/snakeyaml/wiki/readme) – Andrey

0

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

+0

Вы имели в виду classpath by javapath? – izilotti

2

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

Прежде всего, необходимо загрузить 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 

Успехов, Jan

+2

Мне пришлось изменить код Яна, чтобы обернуть ключ в java.lang.String() до того, как hashMap вернет значение, связанное с ключом. Результат метода .get (field) для меня всегда ничего не возвращал. Таким образом, вы можете попробовать изменить строку: d = hashMap.get (field) - d = hashMap.get (java.lang.String (field)), если у вас есть аналогичная проблема. Это предполагает, что ваш keySet имеет тип String, конечно. – 2011-02-08 22:02:32

3

Существует теперь MATLAB обертка для snakeyaml:

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

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

+0

мой плохой, пропущенный ответ jirka – Marc

0

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

Но он не может быть скомпилирован в Windows.

0

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 
Смежные вопросы