0

我有一个.mat文件,我使用它加载scipy

from oct2py import octave
import scipy.io as spio
matPath = "path/to/file.mat"
matFile = spio.loadmat(matPath)

我得到一个 numpy 数组,我想使用它传递给 octave 函数oct2py,如下所示:

aMatStruct = matFile["aMatStruct"]
result = octave.aMatFunction(aMatStruct)

但我收到以下错误:

oct2py.utils.Oct2PyError: Datatype not supported

似乎是由于 array dtype,它看起来像:[('x', 'O'), ('y', 'O'), ('z', 'O')]

因此,我考虑将其更改为'S','U'或受支持的内容。

  1. 怎么做到呢?
  2. 我在otc2py 文档中找不到受支持的dtype 。有什么帮助吗?
  3. 有没有办法.mat用另一个(支持的)dtype 加载文件?我看了这里,但找不到任何有用的东西。

请注意,aMatFunction它的内部使用aMatStruct是这样的:x = aMatStruct.x.

4

2 回答 2

0

我打算建议将结果数组转换为有效的字典,但你打败了我,所以我不会编码它:p

但是,我要建议的另一个更简单的解决方案是,由于您仅在 octave 内使用该结构,您可以将其加载到其工作区并直接评估。即以下对我有用:

>>> octave.load("MyFile.mat")
>>> octave.eval("fieldnames(S)")
ans = 
{
  [1,1] = name
  [2,1] = age
}
[u'name', u'age']

编辑嗯,这是python解决方案;反正我已经开始了:p

>>> from oct2py import octave
>>> from scipy.io import loadmat
>>> F = loadmat("/home/tasos/Desktop/MyFile.mat")
>>> M = F["S"] # the name of the struct variable I saved in the mat file
>>> M = M[0][0]
>>> D = {M.dtype.names[i]:M[i][0] for i in range(len(M))}
>>> out = octave.fieldnames(D); out
[u'age', u'name']
于 2016-09-08T09:21:16.647 回答
0

找到了解决方法!

我使用了以下脚本,它从加载的结构中重建 python 字典,oct2py2然后将其解释为 matlab 结构。

于 2016-09-08T09:06:20.583 回答