python - 将 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。
解决方案
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 数据类型。
如此处所述。在这种情况下,转换是从str到char。当您调用函数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
上面,我使用这个解决方案进行转换。
推荐阅读
- python - AWS Glue 作业 - 将镶木地板文件从 S3 加载到 RDS jsonb 列
- ruby-on-rails - Rails caxlsx - 从右到左对齐文档
- reactjs - React-Redux 和实用程序类
- c# - 如何为遗留相机系统创建 Observable?
- node.js - Loopback 4 with MongoDB 中是否有一种方法可以引用 id 数组中的文档(如 mongoose 中的“populate”)?
- issue-tracking - 如何创建指向特定 BMC Trackit 票证的 URL?
- macos - QGIS-LTR MacOS 半自动分类插件 Numpy 错误全色锐化
- phpmailer - 这是 PHPMailer 和 ImprovMX 的代码
- vb.net - 使用字符串在指定位置创建文件夹
- javascript - 从文件夹 discord.js 中获取随机图像