【问题标题】:convert Python list into MATLAB array将 Python 列表转换为 MATLAB 数组
【发布时间】:2019-10-01 18:34:47
【问题描述】:

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

  • 矢量
  • 矩阵
  • 多维数组

我知道 MATLAB 网站上有 functionsdoc 可以转换这些数据类型。问题是我没有修改算法的权限,只有我发送它的权限。有没有办法在 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)

这是我的terminal 的输出。

你会注意到 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。

【问题讨论】:

  • 我没有收到 477 号码。这些值的总和是 45...?
  • 在运行代码时?我向你保证,它的总和为 477。我将添加一个数字。我知道列表中数字的算术总和为 45...
  • 我在编辑“应该是 45”之前看到了您的帖子,并且好像 预期的总和是 477(而不是 45)。

标签: python arrays matlab type-conversion


【解决方案1】:

pythonData 是一个字符串:

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

当您调用 MATLAB 引擎函数时,字符串正在转换为字符。

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

如文档所述 here。在这种情况下,转换是从 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]])

要解决此问题,您可以从 Python 整数列表创建 matlab.double 对象。然后,您可以调用 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

以上,我使用this 解决方案进行转换。

【讨论】:

  • 谢谢。它确实有效。我知道它正在将其转换为 ASCII,但不知道为什么。所以字符串被转换成字符,干得好。
猜你喜欢
  • 2019-01-23
  • 1970-01-01
  • 2021-03-22
  • 2012-06-13
  • 2011-09-23
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多