好吧,我为自己正确安装了 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 代码将列表转换为几个一维数组,使用 mlabwrap 将一维数组输入到 matlab 中,并编写一些 matlab 代码将这些一维数组转换为单元格。但这很困惑,我想知道是否有更简单的方法。 mlabwrap 能以某种方式为我做这件事吗?

这是我的设置的详细信息。
操作系统:山狮(OS X 10.8),
python :2.7,
MATLAB:2010b,
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]

请注意,这实际上仅适用于常规大小的列表。 IE。 [[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_insertcell_pop 函数在 matlab 中。这些应该使您能够将 python 变量放入现有的元胞数组,并从元胞数组中获取 python 可读的变量。或者,您可以将元胞数组从 matlab 写入 .mat 文件,然后使用 scipy.io.loadmat() 将其读入 python

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

关于python - 如何使用 mlabwrap 从 python 调用带有单元格参数的 matlab 函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15600710/

10-12 23:28