MATLAB是否已经有一个YAML库/解析器?

9
我想使用YAML在多种语言之间传递一些数据。(将其视为“与语言无关的序列化”)。其中一种语言是MATLAB,但我似乎找不到该语言的YAML库。我在Google上搜索了“matlab yaml”和“matlab yaml parse”,但没有找到相关结果。在MATLAB中心搜索“yaml”也没有找到相关内容。
真的没有现成的MATLAB YAML库吗?我可以编写一个,但我希望避免重复工作(也许有什么可以共享的东西吗?)

1
为什么要使用YAML?XML具有更好的跨语言支持。 - Greg Beech
1
你最终使用了什么,它是如何工作的?我处于类似的情况,很想听听你的经验。 - AndyL
有其他一些高优先级的事情出现了,所以我还没有机会尝试这个。如果你在我之前尝试了什么(我会发布),我想听听它的进展如何。 - Benjamin Oakes
8个回答

7
我将Jan的代码进行了扩展,支持更多的数据类型,并将matlab结构写入yaml文件。它不仅是一个m文件,因此我将源代码放在http://code.google.com/p/yamlmatlab/上。 Jiri

我想在集群上使用读取YAML文件的功能(-nojvm)。因此,Java依赖项不是一个选项。是否有MEX版本可用? - Yauhen Yakimovich

3

我相信以下示例可以节省一些时间。

首先,您需要使用Snake 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
我不得不修改Jan的代码,在hashMap返回与键关联的值之前,将键包装在java.lang.String()中。对于我来说,.get(field)方法的结果总是返回空值。所以如果你遇到类似的问题,你可以尝试将这一行代码:d = hashMap.get(field) 改为 d = hashMap.get( java.lang.String(field) )。当然,这假设你的keySet是String类型的。 - user608834

3
现在有一个用于snakeyaml的matlab封装程序:

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

我已经尝试过它,对于简单的yaml文件效果还不错。如果yaml字段名称无效或字符串为空,则存在错误。我在Google Code网站的问题部分提出了这两个问题的解决方法。

我的错,错过了Jirka的答案。 - Marc

3

从Matlab调用现有的Java YAML导入库。这应该很简单。Java-Matlab互操作性非常好,详见matlab帮助。


这是个好主意--我甚至没有想到。在Java中的数据类型会转换为Matlab中的适当类型吗?我没怎么去处理Java这方面的东西... - Benjamin Oakes
数值类型会隐式转换,字符串必须显式转换,可以使用cell(myJavaArray)来转换数组或char(myJavaString),请参考Matlab帮助文档,这方面的内容讲解得非常好。 - Mikhail Poda
@AndyL,现在有一个适用于snakeyaml的matlab包装器。 - Marc
@AndyL,请查看此页面上jirka的答案。 - Marc

1

@AndyL 对于sankeyaml,将其添加到您的javapath中,然后导入('org.yaml.snakeyaml.Yaml'),它就像文档一样工作;生成的LinkedHashMap可以更多或更少地像matlab结构体一样访问。


你是说 javapath 指的是 classpath 吗? - izilotti

0

ZozaniDB数据库工具箱包括一个Matlab本地实现的YAML(分布式为p文件)。

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

  s =

name: apple
calories: 53

>> yaml_parse(s)

ans = 
        name: 'apple'
    calories: 53

0
我为SnakeYAML编写了一个包装器:

https://www.mathworks.com/matlabcentral/fileexchange/106765-yaml

>> data.a = 1.23;
>> data.b = "hello";
>> data.c = {2, {true, 'world'}, yaml.Null};

>> s = yaml.dump(data)

    "a: 1.23
     b: hello
     c:
     - 2.0
     - [true, world]
     - null
     "
   
>> result = yaml.load(s)

  struct with fields:

    a: 1.2300
    b: "hello"
    c: {[2]  {1×2 cell}  [1×1 yaml.Null]}

0

还有Geoffr Adams的MEX实现,称为mat-yaml,带有libyaml解析器-发射器的C绑定)。

但它目前无法在Windows上编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接