我正在练习从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?
答案 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操作的类,但这对于这个空间来说太复杂了。