好吧,我为自己正确安装了 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_insert
和 cell_pop
函数在 matlab 中。这些应该使您能够将 python 变量放入现有的元胞数组,并从元胞数组中获取 python 可读的变量。或者,您可以将元胞数组从 matlab 写入 .mat 文件,然后使用 scipy.io.loadmat()
将其读入 python老实说,除非您出于某种原因绝对需要元胞数组,否则我会尽量避免通过 mlabwrap 使用它们。
关于python - 如何使用 mlabwrap 从 python 调用带有单元格参数的 matlab 函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15600710/