我用的matlab版本是2019a,Python版本是3.6,低版本的好像不支持3.6,之前用的2016a好像才到3.5。
用法
py.文件名.函数名(参数...)
注意:py文件名不能乱取,比如:我上午给取了个test
,报错说“未定义的变量py或函数py.xxxx”(这个xxxx是我文件里的函数的名字)。艾玛,网上搜了好久,才发现可能是我的文件名有问题,就改了一下,发现,癌,好了
。
就是这个文件名可能和标准库中的模块或系统上安装的任何第三方库同名,就可能会报这个错,由于我Python的解释器是Anaconda的,可能他有个自带的叫test的东西把
。
传入的参数为标量
py文件:sum_test.py
def sum_(a, b):
a = int(a)
b = int(b)
return a + b
在matlab命令行中:
res = py.sum_test.sum_(6, 10)
结果:
res =
Python int - 属性:
denominator: [1×1 py.int]
imag: [1×1 py.int]
numerator: [1×1 py.int]
real: [1×1 py.int]
16
返回的是一个Python对象把,在Python中是一个int类型。
我们可以用int64或者double等,把这个res转化为matlab中的普通变量
>> int64(res)
ans =
int64
16
传入的参数为多维数组(二维以上)
只支持多维的实数数组哦,不支持多维的cell,struct,complex(complex连向量也不行)。
下面以3维的全1数组为例
py文件: test2.py
import numpy as np
def mD(a, fH=None):
a = np.array(a)
print(a) # 把转化后的a打印出来
print('*'*20)
print(a[1, :, :]) # 打印a的第一页
print('*' * 20)
print(a.shape) # 打印a的形状
print('*' * 20)
fH()
print('*' * 20)
print(type(a)) # 打印a的类型
return a
这里要插一下,你在matlab中传入的数组到Python里面会变成memoryview 对象,这个我还不熟悉,所以在python里面把他转化成了numpy中的数组。
这里面的fH参数先忽略,在下面讲。
在matlab命令行中:
>> b = py.test2.mD(ones(3, 3, 2), @py.fHandle.fH);
[[[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]
[1. 1.]]
[[1. 1.]
[1. 1.]
[1. 1.]]]
********************
[[1. 1.]
[1. 1.]
[1. 1.]]
********************
(3, 3, 2)
********************
fH is called
********************
癌, 这个ones(3,3,2)到python这里面好像和matlab里面的不一样了啊。我想着应该是到Python这里面就按照numpy中的ones(page, row, column)来了把,所以就变成了3页,3行,2列。这放在matlab中是3行3列2页。所以在Python中那个print(a[1, :, :])打印的应该是第2页的所有行和列,要想和在matlab里面一样的形状,可以在python代码中对a reshape一下。但是返回的还是原来在matlab中的形状。
向里面传递函数句柄(仅限于指向Python函数的函数句柄)
py文件: fHandle.py
def fH():
print('fH is called')
看名字也知道这是即将要传的函数
py文件: test2.py
import numpy as np
def mD(a, fH=None):
a = np.array(a)
print(a) # 把转化后的a打印出来
print('*'*20)
print(a[1, :, :]) # 打印a的第一页
print('*' * 20)
print(a.shape) # 打印a的形状
print('*' * 20)
fH() # 调用传入的函数
print('*' * 20)
print(type(a)) # 打印a的类型
return a
这mD里面的fH参数就是要接受我们传入的函数句柄的,在后面还调用了它。
在matlab命令行中:
向里面传递结构体
传进去的结构体,会被转化为字典
py文件: test3.py
def struct2dict(a):
print(type(a))
print(a)
在matlab命令行里面
>> a.name = 'Mitch';
>> a.age = 22;
>> py.test3.struct2dict(a)
{'name': 'Mitch', 'age': 22.0}
向里面传入逻辑向量
传入的逻辑向量会被转化成memoryview,同样的我们可以使用numpy.bool_ 把它们转化为numpy的逻辑数组。
py文件: test4.py
import numpy as np
def logicalVector(a):
a = np.bool_(a)
print(type(a))
print(a)
matlab命令行中:
>> b = py.test4.logicalVector([true, false, true]);
[[ True False True]]
>> b
b =
Python ndarray:
1 0 1
使用 details 函数查看 Python 对象的属性。
使用 logical 函数转换为 MATLAB 数组。
还有一堆类型就不写了,给你们看几张从官网截下来的图:
就是你在matlab里面传给py文件的参数类型在python中会被转化成什么样的类型。
这部分官网里面没给啥例子,基本就是一些说明把,我自己随便写了几个例子练习了一下
,会了这些数据的传递,也就基本会用matlab调用你自己写的python程序了
。
补充:重新加载你修改过的py文件
就是你用matlab调用你的py文件后,突然想修改这个py文件了,而你修改后在matlab中并不会立即生效,所以你再调用的还是你修改之前的。
那这情况怎么搞呢:
1. 重启matlab
2. 输入下面这三句,然后你就可以继续调用了
clear classes
mod = py.importlib.import_module('test2');
py.importlib.reload(mod);
--END--