我有一个.mat
文件,我使用scipy
from oct2py import octave
import scipy.io as spio
matPath = "path/to/file.mat"
matFile = spio.loadmat(matPath)
我得到一个numpy数组,我希望使用oct2py
传递给octave函数,就像那样:
aMatStruct = matFile["aMatStruct"]
result = octave.aMatFunction(aMatStruct)
但是我收到以下错误:
oct2py.utils.Oct2PyError: Datatype not supported
这似乎是由于数组dtype
,它看起来像:[('x', 'O'), ('y', 'O'), ('z', 'O')]
所以我考虑将其更改为'S'
,'U'
或支持的内容。
.mat
文件?我看了here但找不到任何有用的东西。请注意,在aMatFunction
内,aMatStruct
使用x = aMatStruct.x
:parameter
。
答案 0 :(得分:0)
找到了解决方法!
我使用following script,它从加载的结构中重构python词典,oct2py2
反过来将其解释为matlab结构。
答案 1 :(得分:0)
我打算建议将生成的数组转换为有效的字典,但是你打败了我,所以我不会对它进行编码:p
然而,我要建议的另一个更简单的解决方案是,由于您只在八度音阶中使用结构,因此可以将其加载到其工作空间中并直接进行评估。即以下为我工作:
>>> 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']