Мне нужно вызвать функцию Python из MATLAB. как я могу это сделать?
Вызовите функцию Python из MATLAB
Ответ 1
У меня было аналогичное требование в моей системе, и это было моим решением:
В MATLAB есть функция perl.m, которая позволяет вам вызывать perl-скрипты из MATLAB. В зависимости от того, какая версия, которую вы используете, будет располагаться где-то вроде
C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\perl.m
Создайте копию под названием python.m, быстрый поиск и замену perl на python, дважды проверьте путь к командной строке, который он устанавливает, чтобы указать на установку python. Теперь вы можете запускать скрипты python из MATLAB.
Пример
Простая квадратичная функция в python, сохраненная как "sqd.py", естественно, если бы я делал это правильно, у меня было бы несколько проверок при тестировании входных аргументов, действительных чисел и т.д.
import sys
def squared(x):
y = x * x
return y
if __name__ == '__main__':
x = float(sys.argv[1])
sys.stdout.write(str(squared(x)))
Затем в MATLAB
>> r=python('sqd.py','3.5')
r =
12.25
>> r=python('sqd.py','5')
r =
25.0
>>
Ответ 2
Попробуйте этот MEX файл для ACTUALLY вызова Python из MATLAB, а не наоборот, как предлагают другие. Он обеспечивает довольно приличную интеграцию: http://algoholic.eu/matpy/
Вы можете сделать что-то подобное легко:
[X,Y]=meshgrid(-10:0.1:10,-10:0.1:10);
Z=sin(X)+cos(Y);
py_export('X','Y','Z')
stmt = sprintf(['import matplotlib\n' ...
'matplotlib.use(''Qt4Agg'')\n' ...
'import matplotlib.pyplot as plt\n' ...
'from mpl_toolkits.mplot3d import axes3d\n' ...
'f=plt.figure()\n' ...
'ax=f.gca(projection=''3d'')\n' ...
'cset=ax.plot_surface(X,Y,Z)\n' ...
'ax.clabel(cset,fontsize=9,inline=1)\n' ...
'plt.show()']);
py('eval', stmt);
Ответ 3
С Matlab 2014b библиотеки python можно называть непосредственно из Matlab. Префикс py.
добавляется ко всем именам пакетов:
wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
Ответ 4
Вы можете внедрить свой Python script в программу C, а затем MEX программа C с MATLAB, но это может быть большой работой по сравнению с дамкой результатов в файл.
Вы можете вызвать функции MATLAB в Python, используя PyMat. Кроме того, SciPy имеет несколько дублирующих функций MATLAB.
Но если вам нужно запустить скрипты Python из MATLAB, вы можете попробовать запустить команды system для запуска script и сохранить приводит к файлу и читает его позже в MATLAB.
Ответ 5
Как сказал @dgorissen, Jython - это самое простое решение.
Просто установите Jython с домашней страницы.
Тогда:
javaaddpath('/path-to-your-jython-installation/jython.jar')
import org.python.util.PythonInterpreter;
python = PythonInterpreter; %# takes a long time to load!
python.exec('import some_module');
python.exec('result = some_module.run_something()');
result = python.get('result');
В некоторых примерах см. документацию.
Опасайтесь: я никогда не работал с Jython, и кажется, что стандартная библиотека, которую можно узнать из CPython, не полностью реализована в Jython!
Небольшие примеры, которые я тестировал, работали нормально, но вы можете обнаружить, что вы должны добавить свой код кода Python в sys.path
.
Ответ 6
Самый простой способ сделать это - использовать MATLAB system.
В принципе, вы должны выполнить функцию Python на MATLAB, как в командной строке (Windows) или оболочке (Linux):
system('python pythonfile.py')
Выше приведен пример простого запуска файла Python. Если вы хотите запустить функцию Python (и дать несколько аргументов), вам понадобится что-то вроде:
system('python pythonfile.py argument')
Для конкретного примера возьмите код Python в Adrian, ответьте на этот вопрос и сохраните его в файле Python, то есть test.py
. Затем поместите этот файл в свой каталог MATLAB и выполните следующую команду на MATLAB:
system('python test.py 2')
И вы получите как результат 4 или 2 ^ 2.
Примечание. MATLAB просматривает текущий каталог MATLAB для любого файла Python, который вы указываете с помощью команды system
.
Это, вероятно, самый простой способ решить вашу проблему, поскольку вы просто используете существующую функцию в MATLAB для выполнения своих ставок.
Ответ 7
Поскольку MATLAB плавно интегрируется с Java, вы можете использовать Jython, чтобы написать script и вызвать это из MATLAB (вам может потребоваться добавить тонкую чистую оболочку JKava для фактического вызова кода Jython). Я никогда не пробовал, но я не понимаю, почему это не сработает.
Ответ 8
Я адаптировал perl.m
к python.m
и привязал это для справки для других, но я не могу получить какой-либо вывод из сценариев Python, которые будут возвращены переменной MATLAB: (
Вот мой M файл; note Я указываю прямо в папку Python C:\python27_64
в моем коде, и это изменится в вашей системе.
function [result status] = python(varargin)
cmdString = '';
for i = 1:nargin
thisArg = varargin{i};
if isempty(thisArg) || ~ischar(thisArg)
error('MATLAB:python:InputsMustBeStrings', 'All input arguments must be valid strings.');
end
if i==1
if exist(thisArg, 'file')==2
if isempty(dir(thisArg))
thisArg = which(thisArg);
end
else
error('MATLAB:python:FileNotFound', 'Unable to find Python file: %s', thisArg);
end
end
if any(thisArg == ' ')
thisArg = ['"', thisArg, '"'];
end
cmdString = [cmdString, ' ', thisArg];
end
errTxtNoPython = 'Unable to find Python executable.';
if isempty(cmdString)
error('MATLAB:python:NoPythonCommand', 'No python command specified');
elseif ispc
pythonCmd = 'C:\python27_64';
cmdString = ['python' cmdString];
pythonCmd = ['set PATH=',pythonCmd, ';%PATH%&' cmdString];
[status, result] = dos(pythonCmd)
else
[status ignore] = unix('which python'); %#ok
if (status == 0)
cmdString = ['python', cmdString];
[status, result] = unix(cmdString);
else
error('MATLAB:python:NoExecutable', errTxtNoPython);
end
end
if nargout < 2 && status~=0
error('MATLAB:python:ExecutionError', ...
'System error: %sCommand executed: %s', result, cmdString);
end
EDIT:
Исправлена проблема с исходной точкой perl.m на установку Perl в папке MATLAB путем обновления PATH, затем вызов Perl. Вышеупомянутая функция указывает на мою установку Python. Когда я назвал свой function.py
файл, он был в другом каталоге и вызвал другие файлы в этом каталоге. Они не отражаются в PATH, и мне пришлось легко установить мои файлы Python в мой дистрибутив Python.
Ответ 9
Немного известно (и немного documented) факт о MATLAB system()
: в unixoid системах он использует любой интерпретатор, заданный в переменной окружения SHELL
или MATLAB_SHELL
во время запуска MATLAB. Поэтому, если вы запустите MATLAB с помощью
SHELL='/usr/bin/python' matlab
любые последующие вызовы system()
будут использовать Python вместо вашей оболочки по умолчанию в качестве интерпретатора.
Ответ 10
Начиная с Matlab 2014b функции Python можно вызывать напрямую. Используйте префикс py, затем имя модуля и, наконец, имя функции, например:
result = py.module_name.function_name(parameter1);
Обязательно добавьте script в путь поиска Python при вызове из Matlab, если вы находитесь в другом рабочем каталоге, чем в каталоге Python script.
Подробнее см. в видео, который я разместил.
Ответ 11
Это кажется подходящим методом для "туннельных" функций от Python до MATLAB:
http://code.google.com/p/python-matlab-wormholes/
Большим преимуществом является то, что вы можете обрабатывать ndarrays с ним, что невозможно в стандартном выпуске программ, как это было предложено ранее. (Пожалуйста, поправьте меня, если вы считаете, что это не так - это избавит меня от многих проблем:-))
Ответ 12
Так как Python является лучшим языком клея, может быть проще вызвать MATLAB часть вашей программы из Python вместо наоборот.
Отъезд Mlabwrap.