从MATLAB调用Python函数

Sar*_*rah 66 python matlab language-interoperability

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

Adr*_*ian 43

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

在MATLAB中有一个名为perl.m的函数,它允许您从MATLAB调用perl脚本.根据您使用的版本,它将位于某个位置

C:\Program Files\MATLAB\R2008a\toolbox\matlab\general\perl.m
Run Code Online (Sandbox Code Playgroud)

创建一个名为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)))
Run Code Online (Sandbox Code Playgroud)

然后在MATLAB中

>> r=python('sqd.py','3.5')
r =
12.25
>> r=python('sqd.py','5')
r =
25.0
>>
Run Code Online (Sandbox Code Playgroud)

  • +1 - MATLAB示例代码看起来很棒 - 你可以发布(代码/链接)`python.m`吗?返回的数据有哪些限制 - 只有标量? (6认同)
  • “ perl”只是进行系统调用以执行Perl脚本-除了“尝试对结果进行Perl调用的结果并将其退出状态转换为status之外”,Perl脚本与MATLAB之间没有数据传输。-http://www.mathworks.com/access/helpdesk/help/techdoc/ref/perl.html (2认同)

Dan*_*iel 23

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

wrapped = py.textwrap.wrap(T); % calls textwrap.wrap in python
Run Code Online (Sandbox Code Playgroud)

  • 这确实是一个很酷的功能 - 但似乎是不完整的 - 例如我不能使用sklearn那样的方式For Details to see my [question](/sf/ask/3216679371/). (4认同)

alg*_*lic 18

尝试使用这个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);
Run Code Online (Sandbox Code Playgroud)

  • 对于那些感兴趣的人,我刚刚发现了另外两个类似的项目:[pythoncall](https://github.com/pv/pythoncall)和[pymex](https://github.com/kw/pymex)(尚未尝试过)他们自己呢) (2认同)

Jac*_*cob 12

您可以将您的Python脚本嵌入到C程序中,然后使用MATLAB MEX C程序,但将结果转储到文件可能需要做很多工作.

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

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


kay*_*kay 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');
Run Code Online (Sandbox Code Playgroud)

有关示例,请参阅文档.

注意:我从未真正使用过Jython,似乎CPython可能知道的标准库在Jython中没有完全实现!

我测试的小例子工作得很好,但您可能会发现必须将Python代码目录添加到sys.path.

  • 它绝对更容易集成.太糟糕了,到目前为止,你不能使用Numpy/Scipy/matplotlib等模块与Jython(在C扩展的帐户上).在科学计算方面,这些库确实是Python的强项 (2认同)

kyp*_*hos 9

最简单的方法是使用MATLAB系统功能.

所以基本上,你可以像在命令提示符(Windows)或shell(Linux)上那样在MATLAB上执行Python函数:

system('python pythonfile.py')
Run Code Online (Sandbox Code Playgroud)

以上是为了简单地运行Python文件.如果你想运行一个Python函数(并给它一些参数),那么你需要这样的东西:

system('python pythonfile.py argument')
Run Code Online (Sandbox Code Playgroud)

举一个具体的例子,在Adrian对这个问题的回答中使用Python代码,并将其保存到Python文件中,即test.py.然后将此文件放在MATLAB目录中并在MATLAB上运行以下命令:

system('python test.py 2')
Run Code Online (Sandbox Code Playgroud)

你会得到4或2 ^ 2的输出.

注意:MATLAB在当前的MATLAB目录中查找您使用该system命令指定的任何Python文件.

这可能是解决问题的最简单方法,因为您只需使用MATLAB中的现有函数进行出价.


Alt*_*ive 7

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

result = py.module_name.function_name(parameter1);
Run Code Online (Sandbox Code Playgroud)

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

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