我需要从MATLAB调用Python函数。我怎样才能做到这一点?
我需要从MATLAB调用Python函数。我怎样才能做到这一点?
Answers:
我对系统有类似的要求,这是我的解决方案:
在MATLAB中,有一个名为perl.m的函数,该函数可让您从MATLAB中调用perl脚本。根据您使用的版本,它会位于类似
C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\perl.m
创建一个名为python.m的副本,快速搜索并用python替换perl,仔细检查其设置的命令路径以指向您的python安装。您现在应该可以从MATLAB运行python脚本。
例
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
>>
perl
只是进行系统调用以执行Perl脚本-在Perl脚本和MATLAB之间没有数据传输,除了“尝试对结果进行Perl调用的结果及其从状态到状态的退出”。- mathworks.com/access/helpdesk/help/techdoc/ref/perl.html
python.m
吗?返回的数据有什么限制-仅标量?
fullfile(matlabroot, 'sys\python\win32\bin\');
指向的路径实际上并不存在,没有定义任何python错误消息,因此message('MATLAB:python:<>')
错误消息赢得了在CTRL + F'd Perl.m中不起作用
使用Matlab 2014b可以直接从matlab调用python库。前缀py.
添加到所有数据包名称:
>> wrapped = py.textwrap.wrap("example")
wrapped =
Python list with no properties.
['example']
py
前缀也可以用于用户定义的python模块(脚本):例如。names = py.mymod.search(N)
。正确的文档页面是这样的:uk.mathworks.com/help/matlab/matlab_external/...
尝试使用此MEX文件从MATLAB实际调用Python,而不是像其他人建议的那样。它提供了相当不错的集成: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);
您可以将Python脚本嵌入C程序中,然后与MATLAB混合C程序,但是与将结果转储到文件相比,这可能需要大量工作。
您可以使用PyMat在Python中调用MATLAB函数。除此之外,SciPy具有几个MATLAB复制功能。
但是,如果您需要从MATLAB运行Python脚本,则可以尝试运行系统命令来运行脚本并将结果存储在文件中,并稍后在MATLAB中读取。
正如@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
。
numpy.ndarray
等同于MATLAB ND矩阵)和MATLAB类型(确实mxArray
在MEX中)之间来回转换。
PyLab
集成
因此,基本上,您将像在命令提示符(Windows)或shell(Linux)上一样在MATLAB上执行Python函数:
system('python pythonfile.py')
上面仅用于运行Python文件。如果您想运行Python函数(并为其提供一些参数),那么您将需要:
system('python pythonfile.py argument')
举一个具体的例子,请在Adrian对此问题的解答中使用Python代码,并将其保存到Python文件中,即test.py
。然后将此文件放在您的MATLAB目录中,并在MATLAB上运行以下命令:
system('python test.py 2')
您将得到4或2 ^ 2的输出。
注意:MATLAB在当前MATLAB目录中查找您使用system
命令指定的任何Python文件。
这可能是解决问题的最简单方法,因为您只需使用MATLAB中的现有函数进行出价即可。
我已经调整了perl.m
topython.m
并将其附加给其他人参考,但是我似乎无法从Python脚本中获得任何输出返回给MATLAB变量:(
这是我的M文件;请注意,我直接C:\python27_64
在代码中指向Python文件夹,这在您的系统上会更改。
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
解决了我的问题,原始的perl.m通过更新PATH然后调用Perl指向MATLAB文件夹中的Perl安装。上面的功能指向我的Python安装。当我调用文件时,该文件位于另一个目录中,并在该目录中调用了其他文件。这些没有反映在PATH中,我不得不将Python文件easy_install安装到我的Python发行版中。function.py
getenv('SHELL')
在MATLAB中进行了检查。无论如何,您应该提到它,不幸的是,该技巧仅适用
就像Daniel所说的那样,您可以使用py直接从Matlab运行python命令。命令。要运行任何库,只需确保Malab运行安装了库的python环境:
在Mac上:
打开一个新的终端窗口;
类型:哪个python(找出python的默认版本安装在哪里);
重新启动Matlab;
例如:
py.sys.version;
py.sklearn.cluster.dbscan
这似乎是从Python到MATLAB的函数“隧道”的一种合适方法:
http://code.google.com/p/python-matlab-wormholes/
最大的优点是您可以使用它来处理ndarrays,这是程序的标准输出所无法实现的,如之前建议的那样。(如果您认为这是错误的,请纠正我-这将为我省去很多麻烦:-))