首页 > 解决方案 > 将 Python 列表转换为 MATLAB 数组

问题描述

我在使用函数sum的 MATLAB 算法中有一个函数。如文档中所述,该函数的输入必须是以下类型之一:

我知道MATLAB 网站上有用于转换这些数据类型的函数文档。问题是我没有修改算法的权限,只有我发送它的权限。有没有办法在 python 中进行适当的更改,而不是在 MATLAB 中获取 python 数据来更改数据类型?

目前,我尝试将引擎中的 MATLAB 函数直接用于 python。我不确定转换是否正常。

这是我的问题的 MWE:

import matlab
import matlab.engine

myEngine = matlab.engine.start_matlab()
pythonData = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
pythonData = myEngine.cellstr(pythonData)
print('after cellstr()', pythonData)
pythonData = myEngine.cell2mat(pythonData)
print('after cell2mat()', pythonData)
matlabSum = myEngine.sum(pythonData)
print('sum:', matlabSum)

这是我终端上的输出。

你会注意到 cellstr 没有做太多,这很奇怪。有没有人知道如何正确地进行这些转换?此外,总和不是 477。它应该是 45。我很确定这是因为它将它转换为 ASCII,这将导致 [49,50,51,...] 给出 477。

由于 matlab 自动将列表转换为单元格,因此我尝试更改整数的每个值,然后将 engine.cell2mat 直接用于列表,但出现此错误:

TypeError: array of MATLAB int64 type cannot be returned on this platform

到目前为止,我仍在尝试将 python 转换为上述 MATLAB 数据格式之一。我运行 Python 2.7。

标签: pythonarraysmatlabtype-conversion

解决方案


pythonData是一个字符串:

>>> pythonData = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> pythonData = myEngine.cellstr(pythonData)
>>> pythonData = myEngine.cell2mat(pythonData)
>>> type(pythonData)
<class 'str'>

当您调用 MATLAB 引擎函数时,字符串将被转换为 char。

当您将 Python® 数据作为输入参数传递给 MATLAB® 函数时,MATLAB Engine for Python 会将数据转换为等效的 MATLAB 数据类型。

如此处所述。在这种情况下,转换是从strchar。当您调用函数sum时,MATLAB 会将字符转换为数字(ASCII 中的 0 是 48,1 是 49,依此类推),并沿第二维执行求和,从而得到令人费解的数字 477。如果执行第一维上的总和,你可以看到,MATLAB实际上是在将字符串中的字符转换为数字:

>>> myEngine.sum(pythonData,1)
matlab.double([[49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0]])

要解决此问题,您可以matlab.double从 Python 整数列表创建一个对象。然后,您可以调用 sum 函数并获得预期的结果。在 Python 3 中,您可以按如下方式执行此操作:

>>> pythonData = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> pythonNum = list(map(int,results))
>>> matlabNum=matlab.double(pythonNum)
>>> myEngine.sum(matlabNum)
45.0

上面,我使用这个解决方案进行转换。


推荐阅读