9

我想使用 YAML 跨多种语言交流一些数据。(将其视为“与语言无关的序列化”。)其中一种语言是 MATLAB,但我似乎找不到该语言的 YAML 库。我在 Google 上检查了“matlab yaml”和“matlab yaml parse”,似乎没有任何相关结果。在 MATLAB Central 上搜索“yaml”也让我两手空空。

MATLAB 真的没有现有的 YAML 库吗?我可以写一个,但我想避免重复工作。(也许有什么要分享的?)

4

8 回答 8

7

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

于 2011-03-02T13:39:46.560 回答
3

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

于 2009-10-28T17:09:24.273 回答
3

我相信,下面的例子可以节省一些时间。

首先,您需要使用蛇 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

祝你好运,简

于 2010-11-09T13:42:38.700 回答
3

现在有一个用于snakeyaml 的 matlab 包装器:

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

我已经尝试过了,它在一个简单的 yaml 文件上运行良好。如果 yaml 字段名称不是有效的字段名称并且字符串为空,则会出现错误。我已经在谷歌代码网站的问题部分中为这两种方法提出了解决方法

于 2011-06-23T14:11:58.783 回答
1

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

于 2010-02-02T20:50:12.647 回答
0

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

但它还不能在 Windows 上编译。

于 2013-08-10T01:38:16.243 回答
0

ZozaniDB 数据库工具箱包括一个用于 YAML 的 Matlab 原生实现(作为 p 文件分发)。

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

  s =

name: apple
calories: 53

>> yaml_parse(s)

ans = 
        name: 'apple'
    calories: 53
于 2015-03-14T07:30:00.767 回答
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]}
于 2022-02-21T19:40:28.740 回答