matlab的代码在python可以运行吗_MATLAB与Python混合编程

编程知识 行业动态 更新时间:2024-06-13 00:20:21

本文将向您展示如何一起(和平且和谐地!)使用MATLAB和Python。我们将假定您使用这两种语言的初学者背景,并提供指向更高级主题的链接。

两种语言各自有非常出色的算法,因此可以共享案例。例如,MATLAB和Python用于构建此空气质量预测应用程序和情感分析算法。两种语言经常一起用于AI应用程序(以至于通过MATLAB,ONNX和TensorFlow进行深度学习网络的直接导入和导出)。

基础

首先,让我们忘记需求。我们需要最新版本的Python,以及MATLAB R2014b以上版本(听起来是升级到R2020a的好时机!)。检查这里的版本细节,并且当然我们还要确保MATLAB和Python的路径设置,以便MATLAB和Python都可以访问我们的代码。

从MATLAB中调用Python

在深入研究之前,我们先要确认MATLAB可以找到Python解释器。使用pyenv函数在MATLAB中执行此操作:

>> pyenv

ans =

PythonEnvironment with properties:

Version: "3.6"

Executable: "C:\Python36\WPy-3670\python-3.6.7.amd64\python.EXE"

Library: "C:\Python36\WPy-3670\python-3.6.7.amd64\python36.dll"

Home: "C:\Python36\WPy-3670\python-3.6.7.amd64"

Status: Loaded

ExecutionMode: OutOfProcess

ProcessID: "20980"

ProcessName: "MATLABPyHost"

这里会返回Python版本和环境设置,当然我们可以通过

现在我们就可以访问Python了!

可以试着从math库中获取sqrt函数,以解决问题。在Python中,我们这样调用它:

>>> import math

>>> math.sqrt(42)

6.48074069840786

要从MATLAB调用相同的Python函数,我们可以使用以下代码:

>> py.math.sqrt(42)

ans =

6.480740698407860

我们使用 format long 来设置在MATLAB和Python中显示相同的精度。

现在,让我们抽象一下上述语法规则:使用以下语法访问Python的模块和函数:

>> py.module_name.function_name

用户定义的模块也是以相同的方式调用。例如,空气质量应用程序中的weather.py模块包含一些功能,这些功能可通过网络API读取给定位置的天气数据:

>> data = py.weather.get_current_weather("Boston","US",key)

data =

Python dict with no properties.

{'coord': {'lon': -71.06, 'lat': 42.36}, 'weather': [{'id': 804, 'main': 'Clouds', 'description': 'overcast clouds', 'icon': '04n'}], 'base': 'stations', 'main': {'temp': 53.2, 'feels_like': 34.9, 'temp_min': 51.01, 'temp_max': 55, 'pressure': 1003, 'humidity': 46}, 'visibility': 16093, 'wind': {'speed': 26.4, 'deg': 230, 'gust': 34.45}, 'clouds': {'all': 90}, 'dt': 1587342601, 'sys': {'type': 1, 'id': 3486, 'country': 'US', 'sunrise': 1587290159, 'sunset': 1587339006}, 'timezone': -14400, 'id': 4930956, 'name': 'Boston', 'cod': 200}

注意,在MATLAB中(!)显示的输出是一个Python字典数据类型,我们可以将其转换为MATLAB类型(还会有更多数据类型支持),但是现在我们可以直接使用它。让我们使用模块中的另一个函数提取感兴趣的信息:

>> weatherData = py.weather.parse_current_json(data)

data =

Python dict with no properties.

{'temp': 39.31, 'feels_like': 31.44, 'temp_min': 37, 'temp_max': 41, 'pressure': 1010, 'humidity': 80, 'speed': 8.05, 'deg': 340, 'city': 'Boston', 'lat': 42.36, 'lon': -71.06, 'current_time': '2020-04-18 20:48:00.985146'}

我们还可以索引字典以调用特定值:

>> T = weatherData{"temp"}

T = 39.3100

注意,我们使用大括号{ }而不是圆括号()。在MATLAB中,访问元胞数组和表等异构数据类型值时,通常使用大括号。一个简单的记住方法是,当您使用圆括号时,会得到相同类型的较大数据集的子集,也就是单元格数组或表。相反,如果使用大括号,则会以其原始数据类型(即double,string,char等)获取被索引的值。因此,在以上示例中,dict是一种异构数据类型,我们将使用大括号来获取双精度类型的温度值。此示例显示了对Python字典的索引。

现在我们有了语法的概念,让我们看看在调用函数时的差别。假设我们要更改天气数据的单位。在Python中,get_forecast函数接受标准的Python关键字参数,如此处的最后一个参数所示:

>>> forecast = weather.get_forecast("Boston","US",key,units="metric")

在MATLAB中,这些参数通过pyargs函数作为名称/值对传递:

>> forecast = py.weather.get_forecast("Boston","US",key,pyargs("units","metric")

现在,我们了解了如何适应MATLAB中的Python语法以及在MATLAB中调用函数。让我们尝试反向的方式吧!

从Python中调用MATLAB

用于Python的MATLAB引擎API可以将MATLAB称为计算引擎,因此我们可以在Python中使用自己想用的MATLAB函数。首先,我们需要通过MATLAB随附的Python软件包进行安装。在操作系统提示符下执行以下命令:

$ cd "matlabroot/extern/engines/python"

$ python setup.py install

“ matlabroot ”是MATLAB的安装目录(可以尝试在MATLAB中调用>> matlabroot进行检查)。检查此文档页面以获取有关设置的更多信息。

现在是最好玩的部分!要从Python调用MATLAB函数,请首先导入并启动引擎(如果已经有一个正在运行的进程,我们也可以使用MATLAB的当前会话进程):

>>> import matlab.engine

>>> eng = matlab.engine.start_matlab()

现在引擎正在运行,让我们调用平方根函数:

>>> x = eng.sqrt(42.0)

6.48074069840786

注意,我们调用sqrt函数时,用42.0而不是42。这种使用方法很重要,后文有详细说明。

我们可以使用MATLAB原生语法调用MATLAB函数,但是仍然有一些明显的差异:获得多个输出的方式不同。例如,在情感分析算法中,MATLAB代码返回用于情感和得分的多个输出。我们需要使用nargout指定输出的数量:

>>> [sentiment,scores] = eng.sentimentAnalysis(text,nargout=2)

Positive

[[0.0,0.510948896408081,0.48905110359191895]]

同样,如果MATLAB函数不返回任何输出(例如该函数将结果写入文件),则需要传递nargout = 0。

完成后,我们应该停止MATLAB引擎以释放系统资源:

>>> eng.exit()

要调用MATLAB运算符(例如著名的反斜杠运算符“ \”来求解方程的线性系统),我们需要使用函数名称(mldivide)而不是运算符。可以参见这里的MATLAB运算符和相关函数的完整列表。

转换数据类型

先前调用sqrt时,在MATLAB中使用42,而在Python中使用42.0。为什么会有所不同?

输入42将在MATLAB中返回一个double值,在Python中返回一个整数。由于MATLAB的sqrt接受single,double或 complex类型的数据,因此如果不使用转换函数float(42)或不键入42.0,我们的平方根示例将出错(因为这里的42是整型,不是MATAB的sqrt支持的类型)。

>>> eng.sqrt(42.0)

6.48074069840786

>>> eng.sqrt(float(42))

6.48074069840786

我们还可以在MATLAB中使用整数和其他类型转换函数(如下表所示)将期望的类型传递给Python函数。

那么输出是怎样的呢?我们已经看到了一些示例:在MATLAB中,sqrt返回了double,但是weather.py中的函数返回了Python字典对象。怎么回事?在可能的情况下,函数输出将以该语言的适当类型表示。否则,我们可以将数据转换为适当的类型。

下表显示了常见数据类型的映射(这个文档包含一个完整的列表)。

一些特殊的MATLAB数据类型(例如timetable或categorical)*将需要一些额外的帮助,并且需要手动转换。当然,我们仍然可以在函数中使用这些数据类型,但是函数需要返回Python解释器可以理解的类型。

担心在MATLAB和Python之间进行所有这些数据传递和转换吗?通常可以通过提前规划来避免这些情况。例如,在情感分析算法中,音频数据以整数形式(而不是默认的double形式)导入,然后直接传递给Python函数。

通常,尤其是在跨团队和跨语言进行协作时,也可以使用文件来传输数据。如果我们的数据采用表格格式,则可以使用Apache Parquet在两种语言之间传输数据。MATLAB使用Apache Arrow在Parquet中有效地读取和写入数据。我们可以从几种支持的语言中读取数据,执行计算并将数据写入Parquet。

这是用于处理较大数据集的常用管道,可以帮助避免进行复制和转换时的额外开销。查看这个文档页面以获取有关如何在MATLAB中读写Parquet文件的更多信息。

错误处理

到目前为止,我们前面的讨论都是关于如何避免错误,但现实是:错误处理会牵扯我们最多的精力,解释错误消息是一项宝贵的技能。有一些很好的文档页面,例如 MATLAB的Python错误和Python的MATLAB错误,用于解决常见问题。

我们最需要知道如何判断错误是来自MATLAB还是Python。

让我们再次演示sqrt调用,但是给出错误的输入数据类型:

>> py.math.sqrt("42")

Python Error: TypeError: must be real number, not str

在MATLAB中,我们在行的开头看到Python Error,然后是Python引发的错误,这使得调试更加容易!MATLAB已捕获Python异常,并将其重新引发为包含相同消息的MATLAB异常。

让我们在Python中模拟同样的错误:

>>> eng.sqrt("42")

Traceback (most recent call last):

...

MatlabExecutionError: Undefined function 'sqrt' for input arguments of type 'char'.

这里的Python回溯被最小化了,但是如果我们看最后一行,我们会看到MatlabExecutionError和MATLAB错误消息。捕获了MATLAB异常,并将其重新引发为带有相同消息的Python异常。

我们也有更多复杂的方法来捕获异常,这对于测试和应用程序共享很有用。在此处查看更多信息。

用MATLAB代码创建Python包

到目前为止,我们已经讨论过如何使用Python中的MATLAB,反之亦然,但是我们这里的假设是两者都安装在同一台计算机上。我们怎样与没安装MATLAB的同行共享我们的工作?MATLAB Compiler SDK帮助我们打包MATLAB代码和其他语言的支持文件,以便从Python(或Java,C / C ++等)调用并在运行时执行。MATLAB还提供了一个应用程序,以帮助您逐步完成该过程并生成必要的文件。

空气质量预测例如使用此过程来创建来自MATLAB预测函数predictAirQual.m的Python包。我们可以使用Library Compiler App并选择要包含的功能(自动检测依赖关系)。

这将打包我们需要的文件,并创建一个setup.py和readme.txt文件,其中包含有关Python步骤的说明。

要在Python中实现调用,需要使用刚刚生成的setup.py文件,进行类似于MATLAB Engine API的安装过程(查看此处说明)。

然后,我们需要导入和初始化包并可以调用函数,如下所示:

>>> import AirQual

>>> aq = AirQual.initialize()

>>> result = aq.predictAirQual()

完成后,请结束该过程以结束所有工作:

>>> aq.terminate()

空气质量示例在共享要在Web界面中使用(并有可能一次被许多用户访问)的MATLAB功能方面更进了一步。在这种情况下,可以将MATLAB Production Server用于负载平衡,并且可以通过RESTful API或Python客户端访问MATLAB代码。

更多内容

除了共享更多资源并进行总结之外,我们在这里将不做进一步介绍。空气质量和情绪分析示例非常有用,可以了解如何以及为什么将MATLAB和Python一起用于令人惊奇的事情!我们还为情感示例创建了简短的视频,这些示例用于从MATLAB调用Python和从Python调用MATLAB。还有一个视频,上面以空气质量为例讨论了以上所有内容。

本文改写自这篇文章,内容有调整。

欢迎您进一步了解以下MATLAB系列文章:吃小羊:MATLAB作图实例:00:索引​zhuanlan.zhihu吃小羊:MATLAB金融工具箱:00:索引​zhuanlan.zhihu吃小羊:MATLAB图像处理:00:索引​zhuanlan.zhihu

更多推荐

matlab的代码在python可以运行吗_MATLAB与Python混合编程

本文发布于:2023-03-29 19:05:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/48ff464077dd5b79d05154354e1218fc.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:代码   matlab   python   Python   _MATLAB

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!