matlab调用python_Matlab调用Python

Matlab具有强大的数据处理能力,提供了大量工具箱,满足各类数值计算需求,且自成体系。而Python则更加开放、自由,基于提供的基本语法,大家可以自由创造轮子,发布后就可以直接pip安装使用。Matlab偏向数值计算,而Python覆盖面则更加广泛,资源更多、更新更快。所以借助Python增强Matlab的能力,好比Matlab插上Python的翅膀,如虎添翼。

环境检查

使用pyversion检查Matlab能否调用Python:

>> pyversion

version: '3.6'

executable: 'f:\Anaconda3\python.EXE'

library: 'f:\Anaconda3\python36.dll'

home: 'f:\Anaconda3'

isloaded: 0

如果列出了Python信息,如版本、路径等,表示能正常检测到Python。其中isloaded表示是否已加载Python,如果执行了Python语句或调用了Python模块,isloaded就变为1:

>> py.print('sdf')

sdf

>> pyversion

version: '3.6'

executable: 'f:\Anaconda3\python.EXE'

library: 'f:\Anaconda3\python36.dll'

home: 'f:\Anaconda3'

isloaded: 1

如果Matlab没有找到Python,则返回为空,这主要是由于Python路径未添加到环境变量所致

>> pyversion

version: ''

executable: ''

library: ''

home: ''

isloaded: 0

解决办法:将Python安装目录添加到环境变量,或者直接指定Python可执行文件的路径

>> pyversion('f:\Anaconda3\python.exe')

>> pyversion

version: '3.6'

executable: 'f:\Anaconda3\python.EXE'

library: 'f:\Anaconda3\python36.dll'

home: 'f:\Anaconda3'

isloaded: 0

简单调用

最简单的调用方式是直接执行Python语句

>> py.print('Hello, Python!')

Hello, Python!

>> py.sys.path

ans =

Python list (不带属性)。

['', 'f:\\Anaconda3\\python36.zip', 'f:\\Anaconda3\\DLLs', ...]

>> py.list([1,2])

ans =

Python list (不带属性)。

[1.0, 2.0]

函数调用

除此之外,还可以编写自己的Python函数,如

# myfun.py

def test():

print('Hello, Matlab!')

def add(a, b):

c = a + b

return c

将Matlab切换到myfun.py所在的目录,调用Python函数

>> py.myfun.test()

Hello, Matlab!

>> py.myfun.add(1,2)

ans =

3

注意:如果修改了myfun.py,Matlab不会立即使用新的代码,需要重载Python模块

% 重载Python模块

clear classes

obj = py.importlib.import_module('myfun');

py.importlib.reload(obj);

执行上面语句后,就可以调用修改过的Python代码了。

类调用

上面是调用Python函数,还可以调用Python类,如:

class myclass():

def __init__(self):

self.count = 0

def add(self):

self.count = self.count + 1

print('count = ', self.count)

Matlab中执行

mycalss = py.myfun.myclass;

for i = 1:5

mycalss.add()

end

结果

count = 1

count = 2

count = 3

count = 4

count = 5

Matlab向Python传递参数

单值传递:在py.myfun.add(1, 2)中,1和2在Matlab中默认是double型,传入Python后,Python默认将其转为Python的float型。类型转换如下表

数组传递:如果传入Matlab数组,Python默认接收为array.array类型。如Matlab传入数组[1, 2],Python接收为array.array('d', [1.0, 2.0])。更多数组转换如下表

如果习惯使用numpy,可以使用np.array(arg_py)将array.array转为numpy数组。

Matlab接收Python返回值

单值转换:如果Python返回1.2(默认float),Matlab无需转换,直接接收为double型的1.2

默认转换的只有以上几种,其他类型需要自己手动转换。如Python中的str,传回Matlab后,如果不做转换,很难操作:

res =

Python str (不带属性)。

Hello, Matlab!

故可以调用string、char转换为Matlab字符串:string(res)或char(res)。其他类型的转换方式如下表

数组传递:可以使用array.array向Matlab返回数组,如

def calc():

return array.array('d', [1, 2])

在Matlab中

>> a = double(py.myfun.calc())

a =

1 2

numpy数组不方便在Matlab中使用,所以可以先在Python中转为array.array,再传递给Matlab

a = np.array([1,2,3]) # numpy数组

b = array.array('d', a) # 转为array

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值