如何使用mlabwrap从python中调用带有单元格参数的matlab函数?

时间:2013-03-24 16:02:48

标签: python matlab mlabwrap

嗯,我为自己安装了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:2010b, mlabwrap:1.1

2 个答案:

答案 0 :(得分: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 和matlab中的cell_pop函数。这些应该使您能够将python变量放入现有的单元格数组中,并从单元格数组中获取python可读的变量。或者,您可以将单元格数组从matlab写入.mat文件,并使用scipy.io.loadmat()

将其读入python

老实说,除非你出于某些原因绝对需要单元格数组,否则我会尽量避免通过mlabwrap使用它们。

答案 1 :(得分:0)

如果这几年以后有人阅读,实际上对单元格数组和char数组有基本的支持,您只需要输入以下内容即可:

mlab._dont_proxy["cell"] = True

在使用返回一个单元格或char数组的matlab命令之前。已在https://github.com/aweinstein/mlabwraphttps://github.com/cpbotha/mlabwrap-purepy

上进行了测试