嗯,我为自己感到自豪,我得到了mlabwrap正确安装,但现在我无法让它与matlab单元一起工作。在python中,列表类似于单元格,因此我认为可以输入一个列表,然后mlabwrap将其转换为单元格。不幸的是,它似乎不是那样工作的。
例如,我有一个matlab m文件:
function list_test(x)
display(x);
在python中,如果我输入
mlab.list_test([[1,2],[3,4]])
我:
x =
1 2
3 4
因此,mlabwrap似乎将我的两个嵌套列表转换为2x2矩阵,这不是我想要的。
当我尝试
mlab.list_test([[1,2],[3,4,5]])
则得到:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/Ben/.virtualenvs/test/lib/python2.7/site-packages/mlabwrap.py", line 607, in mlab_command
return self._do(name, *args, **update({'nout':nout}, kwargs))
File "/Users/Ben/.virtualenvs/test/lib/python2.7/site-packages/mlabwrap.py", line 534, in _do
mlabraw.put(self._session, argnames[-1], arg)
TypeError: a float is required
显然不行
如果我必须,我想我可以写一些python代码将列表转换为几个1-D数组,使用mlabwrap将1-D数组输入matlab,并编写一些matlab代码将这些1-D数组转换为单元格。但这太乱了,我想知道有没有更简单的方法。mlabwrap能为我做这件事吗?
这是我设置的细节。操作系统:Mountain Lion (OS X 10.8)Python: 2.7,Matlab: 2010 b,mlabwrap: 1.1
遗憾的是,mlabwrap对单元格数组的支持有限;将单元格数组传入matlab时,以及从matlab接收单元格数组时。
下面是你的直接问题的答案:
>>> from mlabwrap import mlab as matlab
>>> a = [[1, 2], [3, 4]]
>>> cell = matlab.mat2cell(array(a), [1, 1], [2])
>>> matlab.display(cell)
PROXY_VAL2__ =
[1x2 double]
[1x2 double]
注意,这实际上只适用于有规律大小的列表。即[[1、2],[3,4]]的作品,但[[1、2],[3、4、5]]没有。这是因为mlabwrap不能很好地处理dtype=object数组,而是要求dtype=float数组。
让我们切换到matlab进行快速比较:
>> display(cell)
cell =
[1x2 double] [1x2 double]
看起来不错!然而,当我们切换回python,并尝试实际访问我们创建的单元格数组时:
>>> cell[0][0]
error: Unable to get matrix from MATLAB(TM) workspace
>>> cell[0, 0]
error: Unsupported index type: <type 'tuple'>
>>> type(cell)
mlabwrap.MlabObjectProxy
不幸的是,mlabwrap并不真正允许访问存储在MlabObjectProxy对象中的数据。有几种方法可以尝试绕过这个问题。可以写成cell_insert
和cell_pop
函数。这将使您能够将python变量放入现有的单元格数组中,并从单元格数组中获取python可读的变量。或者,您可以将单元数组从matlab写入.mat文件,然后使用scipy.io.loadmat()
老实说,除非您出于某种原因绝对需要单元格数组,否则我会尽量避免通过mlabwrap.
如果有人在几年后读到这篇文章,实际上有对单元格数组和字符数组的基本支持,你只需要输入这个:
mlab._dont_proxy["cell"] = True
在使用返回单元格或字符数组的matlab命令之前。在https://github.com/aweinstein/mlabwrap和https://github.com/cpbotha/mlabwrap-purepy上进行了测试