Python: преобразование int в double

#python #matlab #python-2.7

#python #matlab #python-2.7

Вопрос:

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

Проблема: ошибка типа: неподдерживаемые типы операндов для *=: ‘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’ и ‘float’

Как мне преобразовать int в double в python?

Комментарии:

1. используйте 5.0 вместо 5

2. Я уже пробовал это, я снова получаю эту ошибку: TypeError: неподдерживаемые типы операндов для *=: ‘double’ и ‘float’

3. Показать всю трассировку ошибок.

4. Что, dims прежде чем вы попробуете *= , это тип с плавающей точкой?

5. matlab не поддерживает *= или другие подобные операции ( = …). Возможно, вы также не можете применить их из python (в процессах matlab). Попробуйте dims = dims*5 , как бы глупо это ни было.

Ответ №1:

Проблема, похоже, в том, что движок MATLAB для не поддерживает ни один из математических операторов Python для типов данных, которые он определяет. Вы даже не можете добавить два собственных типа данных MATLAB.

 >>> matlab.double([[1]]) matlab.double([[1]])
TypeError: unsupported operand type(s) for  : 'double' and 'double'
  

double в этом исключении используется MATLAB double, а не эквивалентный собственный тип 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), поэтому вам нужно будет использовать float:

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

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

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

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

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