Вычисление среднего числового вектора Python в MATLAB - PullRequest
2 голосов
/ 11 декабря 2019

Я пытаюсь вычислить среднее числового вектора Python в MATLAB. Чтобы уточнить, я использую Python, но пытаюсь опираться на некоторые специфичные для MATLAB функции, запуская MATLAB в среде Python. Для этого я использую matlab.engine:

##### (From my Python script) #####
# Simple MATLAB experiment
import numpy as np
!pip install matlab
import matlab.engine
eng = matlab.engine.start_matlab()

data = np.arange(5)
data_list = data.tolist()
eng.workspace['foo'] = data_list
eng.eval('mean(foo)')

После последней строки я продолжаю сталкиваться со следующей ошибкой:

"Файл /Applications/MATLAB_R2018b.app/toolbox/matlab / datafun / mean.m, строка 127, в среднем неверный тип данных. Первый аргумент должен быть числовым или логическим. "

Насколько я понимаю, это связано с тем, что MATLAB как-то не распознает типобъекты, хранящиеся в data_list, когда data_list переносится в рабочую область механизма (как foo). Я пытался (1) указать dtype при создании данных объекта и (2) удалить data.tolist() и перенести data напрямую, но оба метода не решают проблему. (Метод 2 выдает другую ошибку, "Ошибка типа: неподдерживаемый тип данных Python: numpy.ndarray" .)

Я использую MATLAB R2018b и Python 3.6.

Можеткто-нибудь здесь поможет устранить неполадки? Заранее спасибо!

1 Ответ

3 голосов
/ 11 декабря 2019

Когда вы вызываете функцию механизма MATLAB, список преобразуется в ячейку.

Когда вы передаете данные Python® в качестве входных аргументов функциям MATLAB®, MATLAB Engine для Python преобразуетданные в эквивалентные типы данных MATLAB.

Как задокументировано здесь .

Вы можете подтвердить, что тип данных является ячейкой в ​​MATLAB

>>> eng.eval('class(foo)')
'cell'

Теперь, когда вы знаете тип данных, просто преобразуйте данные:

>>> eng.eval('mean(cell2mat(foo))')
2.0
...