4

好吧,我为自己正确安装了 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 可以以某种方式为我做这件事吗?

这是我的设置的详细信息。操作系统:Mountain Lion (OS X 10.8),Python:2.7,Matlab:2010b,mlabwrap:1.1

4

2 回答 2

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 对象中的数据。有几种方法可以尝试解决这个问题。您可以在 matlab 中编写cell_insert 和函数。cell_pop这些应该使您能够将 python 变量放入现有的元胞数组中,并从元胞数组中获取 python 可读的变量。或者,您可以将元胞数组写入 matlab 中的 .mat 文件,然后使用scipy.io.loadmat()

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

于 2013-05-30T17:31:42.967 回答
0

如果有人在多年后阅读,实际上对元胞数组和字符数组有基本支持,您只需键入以下内容:

mlab._dont_proxy["cell"] = True

在使用返回单元格或字符数组的 matlab 命令之前。这在https://github.com/aweinstein/mlabwraphttps://github.com/cpbotha/mlabwrap-purepy上进行了测试

于 2019-11-21T18:58:32.947 回答