(反)将MATLAB图形对象从Python序列化/反序列化到Python

(反)将MATLAB图形对象从Python序列化/反序列化到Python,matlab,python-2.7,serialization,graph,deserialization,Matlab,Python 2.7,Serialization,Graph,Deserialization,有一个。我想反序列化一个带有许多节点和边属性的图,这些属性通过MATLAB函数序列化为Python。我知道and(对于MatlabV7.3saved文件),但这两个文件似乎都没有在Python中生成一个表示形式,它实际上保存了可理解的顶点/边数据 我该怎么做?我关心的是这个和逆运算,也就是说,将一个对象从Python写入MATLAB可以读取的格式。是否存在序列化MATLAB对象和/或某个图形的字节数据描述 例如,在MATLAB中,我可以: s = [1 1 2 2 3]; t = [2 4 3

有一个。我想反序列化一个带有许多节点和边属性的图,这些属性通过MATLAB函数序列化为Python。我知道and(对于MatlabV7.3
save
d文件),但这两个文件似乎都没有在Python中生成一个表示形式,它实际上保存了可理解的顶点/边数据

我该怎么做?我关心的是这个和逆运算,也就是说,将一个对象从Python写入MATLAB可以读取的格式。是否存在序列化MATLAB对象和/或某个图形的字节数据描述

例如,在MATLAB中,我可以:

s = [1 1 2 2 3];
t = [2 4 3 4 4];
G = digraph(s,t);
G.Edges.Rand = rand(size(G.Edges)); % Add an edge attribute
G.Nodes.Val = rand(size(G.Nodes)); % Add a node attribute

save('loadmat.mat', 'G'); % Readable by scipy.io.loadmat
save('h5py.mat', 'G', '-v7.3'); % Readable by h5py.File
然后,我可以用Python阅读这些

from scipy.io import loadmat
G0 = loadmat('loadmat.mat')

from h5py import File
G1 = File('h5py.mat')
两者似乎都没有给我顶点/边数据,或者我只是缺少了它


感谢

有向图对象是用户定义的对象类型,而不是基本的MATLAB类型之一;难怪python不理解它。请注意,如果MATLAB没有保存对象的类的工作定义(可在路径中访问),则即使MATLAB也无法理解保存的对象布局

您可能希望保存邻接矩阵:

A = full(adjacency(G));
save('adjacency.mat', 'A');
或关联矩阵:

I = full(incidence(G));
save('incidence.mat', 'I');
什么更适合你

后期编辑

另一种方法是强制对象成为POD(普通的旧数据),以便更好地被
loadmat
理解:

S = struct(G);
save('pod_digraph.mat', 'S');

但请记住,你可以访问所有信息;从属属性将按此方式保存;为了保持一致性,您需要自己重新创建类的接口(例如,邻接矩阵和关联矩阵都可以根据相同的内部信息动态构建,这两种信息可能看起来都不一样)。此外,除非构造器知道如何将POD转换为原始对象,否则无法将POD转换为原始对象。

有向图对象是用户定义的对象类型,而不是基本的MATLAB类型之一;难怪python不理解它。请注意,如果MATLAB没有保存对象的类的工作定义(可在路径中访问),则即使MATLAB也无法理解保存的对象布局

您可能希望保存邻接矩阵:

A = full(adjacency(G));
save('adjacency.mat', 'A');
或关联矩阵:

I = full(incidence(G));
save('incidence.mat', 'I');
什么更适合你

后期编辑

另一种方法是强制对象成为POD(普通的旧数据),以便更好地被
loadmat
理解:

S = struct(G);
save('pod_digraph.mat', 'S');

但请记住,你可以访问所有信息;从属属性将按此方式保存;为了保持一致性,您需要自己重新创建类的接口(例如,邻接矩阵和关联矩阵都可以根据相同的内部信息动态构建,这两种信息可能看起来都不一样)。此外,除非构造函数知道如何将POD转换为原始对象,否则无法将POD转换为原始对象。

这样做的冗长但特定的方法是用类似的方式为G定义一个模式。使用该模式,您可以自动为Python和Java生成serialiser源代码(可以在Matlab中使用)。这将允许您在Matlab和Python之间交换G,或者在其他任何东西之间交换G


您可能需要手工编写代码来转换G在Matlab中的存储方式和protoc选择在Java中表示模式中定义的消息的方式。你将无法(我相当肯定)完成Ggpb=G。如果Java和Matlab都支持类型反射,那么你可能会写一些简洁的东西来自动完成……

完成这项工作的冗长但确定的方法是用类似的方式定义G的模式。使用该模式,您可以自动为Python和Java生成serialiser源代码(可以在Matlab中使用)。这将允许您在Matlab和Python之间交换G,或者在其他任何东西之间交换G


您可能需要手工编写代码来转换G在Matlab中的存储方式和protoc选择在Java中表示模式中定义的消息的方式。您将无法(我相当肯定)执行Ggpb=G。如果Java和Matlab都支持类型反射,那么您可能会编写一些简洁的代码来自动执行……

这将不起作用,因为我有属性图(我已经澄清了这个问题)。此外,loadmat实际上能够读取序列化matlab对象上的标题,并找出它是一个有向图,因此这必须是可行的。@quine您想在这方面投入多少精力?由于IMO无法自动执行此操作,因此您可以使用两种语言编写I/O函数,将本地对象存储和检索为通用存储格式(在这里您可以选择任何您想要的格式:XML、JSON等),或者使用每种语言编写函数,直接以另一种语言的格式导出(这很混乱)。最后一个需要一些黑客和逆向工程。祝你好运@quine关于
loadmat
看到.mat文件中的
digraph
对象,我想打个比方:你在记事本中打开一个文件,你看到它以PK开头,你就知道它是一个ZIP存档。但这并不意味着你可以在记事本中阅读档案的内容;你需要一些其他的东西来读取归档文件的内容。我愿意写尽可能多的代码,但我想让matlab用户不透明地保存,让我在python端进行提升以读取/写入matlab数据。看来这是不可能的。我知道loadmat可能不理解保存的对象中包含的数据,但它可以读取标题,这意味着他们比我更了解序列化的matlab对象。我真正需要的是对数据结构的描述,但这似乎很难找到。@quine希望这会有所帮助:这不起作用,因为我有属性图(我已经澄清了这个问题)。此外,loadmat实际上能够读取序列化matlab obje上的标题