2016-10-19 2 views
0

Я занимаюсь вызовами функций matlab из python , и я получаю эту ошибку, что, похоже, я не понимаю, как ее исправить.Python: Cast int to double

Проблема: TypeError: неподдерживаемый тип (ы) операнд * =: 'двойной' и 'INT'

Это мой код:

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

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

print(dims) 

Я могу предположить, что ones возвращает двойной и 5 - int И это меняет мою проблему на то, чтобы скрыть int.

Я попытался с помощью поплавка (5), но затем я получаю это: TypeError: тип (ы) неподдерживаемый операнда для * =: «двойной» и «Поплавок»

Как бросить Int к двойному в python?

+0

использование '5.0' вместо' 5' – CoconutBandit

+0

Я уже попробовал эту я получаю эту ошибку еще раз: TypeError: неподдерживаемый тип операнда (ов) для * =: «двойной» и «Поплавок» –

+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. 

разница заключается в том, что 5 в Python является целым числом, в то время как 5 в MATLAB является двойной, так что вы не будете видеть эту ошибку при использовании MATLAB, если вы явно не преобразовать в тип целого числа.

Вы также можете использовать функцию eval оценить символическое выражение, но сначала вам нужно загрузить переменную в MATLAB:

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

Было бы также теоретически возможно создать класс, который оборачивает классы MATLAB и поддерживает операции Python, но это становится слишком сложным для этого пространства.