首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用mlabwrap从python中调用带单元格参数的matlab函数?

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

Stack Overflow用户
提问于 2013-03-25 00:02:48
回答 2查看 1.6K关注 0票数 4

嗯,我为自己正确安装了mlabwrap而感到自豪,但现在我不能让它与matlab单元一起工作。在python中,列表类似于单元格,所以我想我应该输入一个列表,然后mlabwrap会将它转换成一个单元格。不幸的是,它似乎不是这样工作的。

例如,我有一个matlab m文件:

代码语言:javascript
复制
function list_test(x)
display(x);

在python中,如果我键入

代码语言:javascript
复制
mlab.list_test([[1,2],[3,4]])

我得到了:

代码语言:javascript
复制
x =

1     2
3     4

因此,mlabwrap似乎将我的两个嵌套列表转换成一个2x2矩阵,这并不是我想要的。

当我尝试的时候

代码语言:javascript
复制
mlab.list_test([[1,2],[3,4,5]]) 

然后我得到:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-31 01:31:43

不幸的是,mlabwrap对单元数组的支持有限;无论是在将单元数组传递到matlab时,还是在从matlab接收单元数组时。

下面是你直接提出的问题的答案:

代码语言:javascript
复制
>>> 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]不起作用。这是因为dtype=float不能很好地处理mlabwrap数组,而是需要mlabwrap数组。

让我们切换到matlab来进行快速比较:

代码语言:javascript
复制
>> display(cell)

cell = 

    [1x2 double]    [1x2 double]

看起来不错!但是,当我们切换回python,并尝试实际访问我们创建的cell数组时:

代码语言:javascript
复制
>>> 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_insertcell_pop函数。这些应该使您能够将python变量放入现有的单元数组中,并从单元数组中获得python可读的变量。或者,您可以将单元格数组从matlab写入.mat文件,然后使用scipy.io.loadmat()将其读取到python中。

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

票数 1
EN

Stack Overflow用户

发布于 2019-11-22 02:58:33

如果有人在几年后读到这篇文章,实际上已经有了对单元格数组和字符数组的基本支持,您只需键入以下内容:

代码语言:javascript
复制
mlab._dont_proxy["cell"] = True

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15600710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档