75

我需要从 MATLAB 调用 Python 函数。我怎样才能做到这一点?

4

13 回答 13

47

我对我的系统有类似的要求,这是我的解决方案:

在 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
>>
于 2009-11-10T17:22:51.933 回答
30

使用 Matlab 2014b 可以直接从 matlab调用 python 库。前缀py.被添加到所有数据包名称:

>> wrapped = py.textwrap.wrap("example")

wrapped = 

  Python list with no properties.

    ['example']
于 2015-03-21T23:17:51.013 回答
20

试试这个 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);
于 2012-05-29T10:16:14.443 回答
14

您可以将 Python 脚本嵌入到 C 程序中,然后将 C 程序与 MATLAB 混合,但与将结果转储到文件相比,这可能需要大量工作。

您可以使用PyMat在 Python 中调用 MATLAB 函数。除此之外,SciPy有几个 MATLAB 重复函数。

但是,如果您需要从 MATLAB 运行 Python 脚本,您可以尝试运行系统命令来运行脚本并将结果存储在一个文件中,稍后在 MATLAB 中读取它。

于 2009-11-10T13:09:31.547 回答
11

正如@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.

于 2012-08-03T22:37:44.643 回答
10

最简单的方法是使用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 中的现有函数进行投标。

于 2012-03-19T04:09:25.117 回答
7

从 Matlab 2014b 开始可以直接调用 Python 函数。使用前缀 py,然后是模块名称,最后是函数名称,如下所示:

result = py.module_name.function_name(parameter1);

如果您在与 Python 脚本不同的工作目录中,请确保在从 Matlab 调用时将脚本添加到 Python 搜索路径。

在此处查看更多详细信息。

于 2016-10-12T18:43:29.867 回答
4

关于MATLAB函数的一个鲜为人知(也很少记录)的事实:在 unixoid 系统上,它使用环境变量中或启动 MATLAB 时给出的任何解释器。所以如果你启动 MATLABsystem()SHELLMATLAB_SHELL

SHELL='/usr/bin/python' matlab

任何后续system()调用都将使用Python而不是您的默认 shell 作为解释器。

于 2013-01-03T09:08:06.480 回答
4

我已经调整了perl.mtopython.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 文件轻松安装到我的 Python 发行版中。function.py

于 2012-02-24T14:23:16.427 回答
3

由于MATLAB与 Java 无缝集成,您可以使用Jython编写脚本并从 MATLAB 调用它(您可能需要添加一个精简的纯 JKava 包装器才能实际调用 Jython 代码)。我从未尝试过,但我不明白为什么它不起作用。

于 2011-02-21T12:02:51.070 回答
3

就像丹尼尔说的那样,您可以使用 py.xml 直接从 Matlab 运行 python 命令。命令。要运行任何库,您只需确保 Malab 正在运行您安装库的 python 环境:

在 Mac 上:

  • 打开一个新的终端窗口;

  • type: which python (找出默认版本的python安装在哪里);

  • 重启matlab;

  • 在命令行中键入:pyv​​ersion('/anaconda2/bin/python')(显然替换为您的路径)。
  • 您现在可以运行默认 python 安装中的所有库。

例如:

py.sys.版本;

py.sklearn.cluster.dbscan

于 2018-04-27T07:31:31.420 回答
1

这似乎是将函数从Python “隧道”到MATLAB的合适方法:

http://code.google.com/p/python-matlab-wormholes/

最大的优势是您可以使用它来处理 ndarray,这在程序的标准输出中是不可能的,如前所述。(请纠正我,如果您认为这是错误的 - 它会为我省去很多麻烦:-))

于 2012-05-16T08:59:18.420 回答
-1

由于Python是一种更好的粘合语言,因此从 Python 调用程序的MATLAB部分可能更容易,反之亦然。

查看Mlabwrap

于 2010-04-16T01:48:54.060 回答