Python:将int转换为double

时间:2016-10-19 14:50:31

标签: python matlab python-2.7

我正在练习从python调用matlab函数 我收到这个错误,我似乎不明白如何修复。

问题: TypeError:* =:' double'不支持的操作数类型和' int'

这是我的代码:

import matlab.engine
mat = matlab.engine.start_matlab()

dims = mat.ones(1, 3)
dims *= 5 // here is the problem

print(dims)

我可以假设ones返回一个double,5是int     这改变了我的问题,将int转换为double。

我尝试使用float(5),但后来我得到了这个: TypeError:* =:' double'不支持的操作数类型并且'浮动'

如何在python中将int转换为double?

1 个答案:

答案 0 :(得分:0)

问题似乎是MATLAB引擎不支持它定义的数据类型的任何python数学运算符。你甚至无法添加两个MATLAB自己的数据类型。

>>> matlab.double([[1]])+matlab.double([[1]])
TypeError: unsupported operand type(s) for +: 'double' and 'double'
此异常中的

double是一个MATLAB双精度数,而不是等效的Python本机类​​型(float)。

我能够始终如一地工作的是numpy数组:

>>> matlab.double([[1]])+np.array(1)
array([[2.]])

但请注意,结果是array。这是一种numpy数据类型。所以看起来MATLAB也不支持numpy数组,而是numpy数组支持MATLAB数据类型并将它们转换为数组。那可能不是你想要的。

没有理由这是不可能的。 Python提供了实现此类事物的所有钩子。 MATLAB不支持它。

如果您不愿意转换为numpy数组,您需要做的是使用MATLAB运算符的函数版本来进行计算。这更加冗长,但假设您遵循MATLAB构建规则,则可以正常工作:

>>> mat.times(dims, 5.)
matlab.double([[5.0,5.0,5.0]])

不幸的是,在MATLAB中根本不允许将整数添加到双矩阵中(即使在MATLAB自己的解释器中),因此您需要使用浮点数:

>>> mat.times(dims, 5)
MatlabExecutionError: Integers can only be combined with integers of the same class, or scalar doubles.

不同之处在于Python中的5是一个整数,而MATLAB中的5是一个双精度,因此除非明确转换为整数类型,否则在使用MATLAB时不会看到此错误。

您也可以使用eval函数来评估符号表达式,但首先需要将变量加载到MATLAB中:

>>> mat.workspace['dims'] = dims
>>> mat.eval('dims*5')
matlab.double([[5.0,5.0,5.0]])

理论上也可以创建一个包装MATLAB类并支持Python操作的类,但这对于这个空间来说太复杂了。