преобразовать список Python в массив MATLAB - PullRequest
3 голосов
/ 14 мая 2019

У меня есть функция в алгоритме MATLAB, которая использует функцию sum .Как описано в doc , вход этой функции должен быть одного из следующих типов:

  • Vector
  • Matrix
  • Многомерный массив

Я знаю, что на сайте MATLAB есть функции и doc для конвертации этих типов данных.Проблема в том, что у меня нет разрешения изменять алгоритм, только то, на что я его отправляю.Есть ли способ внести соответствующие изменения в python вместо того, чтобы брать данные python в MATLAB и вносить изменения в тип данных?

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

Вот MWE моей проблемы:

import matlab
import matlab.engine

myEngine = matlab.engine.start_matlab()
pythonData = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
pythonData = myEngine.cellstr(pythonData)
print('after cellstr()', pythonData)
pythonData = myEngine.cell2mat(pythonData)
print('after cell2mat()', pythonData)
matlabSum = myEngine.sum(pythonData)
print('sum:', matlabSum)

Вот вывод на мой терминал .

Вы заметите, что cellstr мало что сделал, что странно.У кого-нибудь есть идеи о том, как правильно сделать эти преобразования?Кроме того, сумма не 477. Это может быть 45. Я вполне уверен, что это потому, что он преобразует его в ASCII, что приведет к [49,50,51, ...], давая 477.

Поскольку matlab автоматически преобразовывает списки в ячейки, я попытался изменить каждое значение для целых чисел, а затем использовать engine.cell2mat непосредственно в список, но я получаю эту ошибку:

TypeError: array of MATLAB int64 type cannot be returned on this platform

На данный момент явсе еще пытаюсь преобразовать питона в один из форматов данных MATLAB, упомянутых выше.Я использую Python 2.7.

1 Ответ

3 голосов
/ 14 мая 2019

pythonData является строкой:

>>> pythonData = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> pythonData = myEngine.cellstr(pythonData)
>>> pythonData = myEngine.cell2mat(pythonData)
>>> type(pythonData)
<class 'str'>

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

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

Как задокументировано здесь .В этом случае преобразование составляет от str до char .Когда вы вызываете функцию sum , MATLAB преобразует символы в числа (0 - 48 в ASCII, 1 - 49 и т. Д.) И выполняет суммирование по второму измерению, что приводит к недоумениючисло 477. Если вы выполните сумму для первого измерения, вы увидите, что MATLAB фактически преобразовывает символы в строке в числа:

>>> myEngine.sum(pythonData,1)
matlab.double([[49.0,50.0,51.0,52.0,53.0,54.0,55.0,56.0,57.0]])

Чтобы решить эту проблему, вы можетесоздайте объект matlab.double из списка объектов Python.Затем вы можете вызвать функцию суммирования и получить ожидаемый результат.В Python 3 вы можете сделать это следующим образом:

>>> pythonData = ['1', '2', '3', '4', '5', '6', '7', '8', '9']
>>> pythonNum = list(map(int,results))
>>> matlabNum=matlab.double(pythonNum)
>>> myEngine.sum(matlabNum)
45.0

Выше я использую это решение для конвертации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...