从 MATLAB 调用 Python 函数

2025-03-04 08:27:00
admin
原创
108
摘要:问题描述:我需要从 MATLAB 调用一个 Python 函数。我该怎么做?解决方案 1:我的系统有类似的要求,这是我的解决方案:在 MATLAB 中有一个名为 perl.m 的函数,它允许您从 MATLAB 调用 perl 脚本。根据您使用的版本,它将位于类似C:Program FilesMATLABR20...

问题描述:

我需要从 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;

  • 在命令行中输入:pyv​​ersion('/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。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   4046  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2770  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   90  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   105  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   93  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用