我想使用 YAML 跨多种语言交流一些数据。(将其视为“与语言无关的序列化”。)其中一种语言是 MATLAB,但我似乎找不到该语言的 YAML 库。我在 Google 上检查了“matlab yaml”和“matlab yaml parse”,似乎没有任何相关结果。在 MATLAB Central 上搜索“yaml”也让我两手空空。
MATLAB 真的没有现有的 YAML 库吗?我可以写一个,但我想避免重复工作。(也许有什么要分享的?)
我扩展了Jan的代码以支持更多数据类型以及将 matlab 结构写入 yaml 文件。它不仅仅是一个 m 文件,因此我在http://code.google.com/p/yamlmatlab/ Jiri上找到了源代码
从 Matlab 调用现有的 Java YAML 导入库。这应该很简单。Java-Matlab 互操作性很好,见 matlab 帮助。
我相信,下面的例子可以节省一些时间。
首先,您需要使用蛇 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
祝你好运,简
现在有一个用于snakeyaml 的 matlab 包装器:
http://code.google.com/p/yamlmatlab/
我已经尝试过了,它在一个简单的 yaml 文件上运行良好。如果 yaml 字段名称不是有效的字段名称并且字符串为空,则会出现错误。我已经在谷歌代码网站的问题部分中为这两种方法提出了解决方法
@AndyL 对于 sankeyaml,将其添加到您的 javapath,然后导入('org.yaml.snakeyaml.Yaml'),它就像文档一样工作;生成的 LinkedHashMap 或多或少像 matlab 结构一样被访问。
Geoffr Adams 还有一个 MEX 实现,称为mat-yaml ,带有用于libyaml解析器发射器的 C 绑定)。
但它还不能在 Windows 上编译。
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
我为 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]}