Команда save() в движке matlab для python

Я использую MATLAB Engine API для Python https://nl.mathworks.com/help/matlab/matlab-engine-for-python.html

Я хотел бы открыть и сохранить файл.

#import and start the engine
import matlab.engine
eng = matlab.engine.start_matlab()
print('Matlab engine started')
#File of interest
myBadFile='test.mat'
#Synchronize python/matlab working directory
eng.cd(os.getcwd(),nargout=0)
print(eng.pwd())
#Read file contents
VALUES=eng.load(myBadFile,nargout=1)

Все идет нормально. Я на самом деле удивлен, что это сработало так гладко.

Я делаю свои вещи на VALUES, тогда я хотел бы сохранить его снова. Если я сделаю

VALUES=eng.save(myBadFile+'.test','VALUES','-v6',nargout=0)

Я получил:

MatlabExecutionError: Variable 'VALUES' not found.

Если я сделаю

VALUES=eng.save(myBadFile+'.test',VALUES,'-v6',nargout=0)

я получил

MatlabExecutionError: Argument must contain a character vector.

Итак, как мне сохранить мои VALUES, которые являются допустимой переменной в среде Python, но, по-видимому, в Matlab ее не видно?

1 ответ

Решение

save работает с переменными, содержащимися в рабочей области MATLAB, и Python не разделяет область видимости с экземплярами (ами) движка MATLAB. matlab.engine Экземпляр, однако, имеет workspace атрибут, определяемый следующим образом:

Словарь Python, содержащий ссылки на переменные MATLAB. Вы можете назначать данные и получать данные из переменной MATLAB через workspace, Имя каждой переменной MATLAB, которую вы создаете, становится ключом в workspace толковый словарь. Ключи в workspace должны быть действительными идентификаторами MATLAB (например, вы не можете использовать числа в качестве ключей).

Что вы можете использовать для размещения переменных в области видимости MATLAB.

Этот код, например:

import matlab.engine
eng = matlab.engine.start_matlab()
x = [1, 2, 3]
eng.save('test.mat', 'x')

Сбой, как указано выше:

Error using save
Variable 'x' not found.

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\excaza\AppData\Roaming\Python\Python36\site-packages\matlab\engine\matlabengine.py", line 78, in __call__
    _stderr, feval=True).result()
  File "C:\Users\excaza\AppData\Roaming\Python\Python36\site-packages\matlab\engine\futureresult.py", line 68, in result
    return self.__future.result(timeout)
  File "C:\Users\excaza\AppData\Roaming\Python\Python36\site-packages\matlab\engine\fevalfuture.py", line 82, in result
    self._result = pythonengine.getFEvalResult(self._future,self._nargout, None, out=self._out, err=self._err)
matlab.engine.MatlabExecutionError: Variable 'x' not found.

Но работает нормально, как только мы копируем x в workspace ДИКТ:

import matlab.engine
eng = matlab.engine.start_matlab()
x = [1, 2, 3]
eng.workspace['x'] = x
eng.save('test.mat', 'x')
Другие вопросы по тегам