将Python列表转换为MATLAB数组

3
我在MATLAB算法中有一个函数,它使用sum函数。正如doc所述,该函数的输入必须是以下类型之一:
  • 向量
  • 矩阵
  • 多维数组
我知道MATLAB网站上有functionsdoc用于转换这些数据类型。问题是我没有权限修改算法,只能修改发送给它的内容。是否有一种方法可以在Python中进行适当的更改,而不是将Python数据传递到MATLAB中并进行数据类型更改?
目前,我尝试直接从引擎中使用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 2.7 转换为上述 MATLAB 数据格式之一。


我不明白477这个数字。那些值的总和是45吗? - tryman
当你运行代码时,我保证它会加总到477。我会添加一个数字。我知道列表中数字的算术总和为45... - PyThagoras
我在你编辑前看到了你的帖子“应该是45”,似乎预期总和是477(而不是45)。 - tryman
1个回答

2
"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将字符转换为数字(0在ASCII中为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,但不知道原因。所以字符串被转换为字符,干得好。 - PyThagoras

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接