从 MATLAB 调用 Python 函数
- 2025-03-04 08:27:00
- admin 原创
- 108
问题描述:
我需要从 MATLAB 调用一个 Python 函数。我该怎么做?
解决方案 1:
我的系统有类似的要求,这是我的解决方案:
在 MATLAB 中有一个名为 perl.m 的函数,它允许您从 MATLAB 调用 perl 脚本。根据您使用的版本,它将位于类似
C:Program FilesMATLABR2008a oolboxmatlabgeneralperl.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
>>
解决方案 2:
使用 Matlab 2014b 可以直接从 matlabpy.
调用 python 库。所有数据包名称都添加了前缀:
>> wrapped = py.textwrap.wrap("example")
wrapped =
Python list with no properties.
['example']
解决方案 3:
尝试使用此 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
' ...
'matplotlib.use(''Qt4Agg'')
' ...
'import matplotlib.pyplot as plt
' ...
'from mpl_toolkits.mplot3d import axes3d
' ...
'f=plt.figure()
' ...
'ax=f.gca(projection=''3d'')
' ...
'cset=ax.plot_surface(X,Y,Z)
' ...
'ax.clabel(cset,fontsize=9,inline=1)
' ...
'plt.show()']);
py('eval', stmt);
解决方案 4:
您可以将 Python 脚本嵌入到 C 程序中,然后使用 MATLAB 对 C 程序进行 MEX,但与将结果转储到文件相比,这可能需要做大量工作。
您可以使用PyMat在 Python 中调用 MATLAB 函数。除此之外,SciPy还有几个 MATLAB 重复函数。
但是如果您需要从 MATLAB 运行 Python 脚本,您可以尝试运行系统命令来运行脚本并将结果存储在文件中,然后在 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的系统函数。
因此基本上,您可以在 MATLAB 上执行 Python 函数,就像在命令提示符(Windows)或 shell(Linux)上执行的那样:
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 中现有的函数来执行您的任务。
解决方案 7:
从 Matlab 2014b 开始,可以直接调用 Python 函数。使用前缀 py,然后是模块名称,最后是函数名称,如下所示:
result = py.module_name.function_name(argument1, argument2, ...);
如果您所在的工作目录与 Python 脚本所在的工作目录不同,请确保从 Matlab 调用时将脚本添加到 Python 搜索路径。
介绍
下面的源代码解释了如何从 Matlab 脚本中调用 Python 模块中的函数。
假设 MATLAB 和 Python 已经安装(在此特定示例中还有 NumPy)。
在探索该主题时,我找到了MathWorks 网站上的此链接(MATLAB 2014b 发行说明),该链接表明从 Matlab R2014b 开始是可能的。
指示
在下面的例子中,假定当前工作目录具有以下结构:
our_module
|
+-> our_script.py
matlab_scripts
|
+-> matlab_script.m
从一个简单的脚本our_module/our_script.py开始:
import numpy
def our_function(text):
print('%s %f' % (text, numpy.nan))
它有一个函数,可以打印作为参数传递给它的字符串,后跟 NaN(非数字)值。
将其保存在自己的目录our_module中。
接下来,转到 Matlab 并导航到 Python 模块(our_module)所在的当前工作目录。
使用以下语句从 Python 模块调用该函数:
py.our_module.our_script.our_function('Hello')
这将产生预期的结果:
>> py.our_module.our_script.our_function('Hello')
Hello nan
>>
但是,matlab_scripts目录(在our_module目录旁边创建)中仅包含上述语句的matlab_script.m文件将导致以下结果:
>> matlab_script
Undefined variable "py" or class "py.our_module.our_script.our_function".
Error in matlab_script (line 1)
py.our_module.our_script.our_function('Hello')
>>
在寻找解决方案时,我发现了一个名为“未定义变量“py”或函数“py.command”的页面,它有助于解决此错误。
假设脚本中没有拼写错误,它建议将基目录添加到 Python 的搜索路径中。
因此Matlab脚本的正确内容应该是:
[own_path, ~, ~] = fileparts(mfilename('fullpath'));
module_path = fullfile(own_path, '..');
python_path = py.sys.path;
if count(python_path, module_path) == 0
insert(python_path, int32(0), module_path);
end
py.our_module.our_script.our_function('Hello')
它获取 Python 模块的位置,找到该模块的基本路径,访问 Python 搜索路径,检查基本路径是否已包含,否则将其插入。
运行修正后的脚本将产生与之前相同的预期输出。
这里还有另一个有用的链接可以帮助您。
解决方案 8:
我已将其改编perl.m
并附python.m
加以供其他人参考,但我似乎无法从 Python 脚本中获取任何输出以返回到 MATLAB 变量 :(
这是我的 M 文件;请注意,我在代码中直接指向 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
编辑 :
通过更新PATH然后调用 Perl ,解决了我的问题,原始 perl.m 指向MATLAB 文件夹中的Perl安装。上面的函数指向我的 Python 安装。当我调用我的文件时,它位于不同的目录中,并调用该目录中的其他文件。这些文件未反映在PATH中,因此我必须将我的 Python 文件 easy_install 到我的 Python 发行版中。function.py
解决方案 9:
关于MATLAB函数的一个鲜为人知(且记录很少)的事实:在 unixoid 系统上,它使用环境变量中或在启动 MATLAB 时给出的任何解释器。因此,如果您使用以下命令启动 MATLABsystem()
`SHELL`MATLAB_SHELL
SHELL='/usr/bin/python' matlab
任何后续system()
调用都将使用Python而不是默认 shell 作为解释器。
解决方案 10:
由于MATLAB与 Java 无缝集成,您可以使用Jython编写脚本并从 MATLAB 调用该脚本(您可能必须添加一个薄的纯 JKava 包装器才能实际调用 Jython 代码)。我从未尝试过,但我不明白为什么它不起作用。
解决方案 11:
就像 Daniel 所说的那样,您可以使用 py. 命令直接从 Matlab 运行 python 命令。要运行任何库,您只需确保 Malab 正在运行您安装库的 python 环境:
在Mac上:
打开一个新的终端窗口;
输入:which python(找出安装默认版本的python的位置);
重新启动Matlab;
在命令行中输入:pyversion('/anaconda2/bin/python')(显然用您的路径替换)。
您现在可以运行默认 Python 安装中的所有库。
例如:
py.sys.版本;
py.sklearn.cluster.dbscan
解决方案 12:
这似乎是将函数从Python “隧道”到MATLAB 的合适方法:
http://code.google.com/p/python-matlab-wormholes/
最大的优点是你可以用它来处理 ndarray,而之前建议的程序标准输出无法做到这一点。(如果你认为这是错的,请纠正我 - 这将为我省去很多麻烦 :-))
解决方案 13:
由于Python是一种更好的粘合语言,因此从 Python 调用程序的MATLAB部分可能比反之亦然 更容易。
查看Mlabwrap。
扫码咨询,免费领取项目管理大礼包!