专门做毕业设计的网站,做门户网站建设多少钱,seo交流论坛,网站关键字 怎么设置问题引入
在做实验的时候#xff0c;需要用到python和matlab工具来进行不同的处理#xff0c;比如在run神经网络的时候#xff0c;需要使用pytorch框架得到网络的各个参数#xff0c;在得到参数后需要使用matlab进行聚类规划。之前的做法是用python脚本耦合其联系#xff…问题引入
在做实验的时候需要用到python和matlab工具来进行不同的处理比如在run神经网络的时候需要使用pytorch框架得到网络的各个参数在得到参数后需要使用matlab进行聚类规划。之前的做法是用python脚本耦合其联系两者通信的方式是通过文件。后来发现matlab有针对于python的api引擎瞬间感觉打开了新世界的大门只需要在python中调用相关的api就可以完成matlab的工作再也不用一个一个复制文件了。
解决思路
首先我安装的是matlab R2015b对应的python版本为3.4本来一开始的版本是python36但是由于matlab2015并不兼容py36解决方法是一方面可以通过重新安装高版本的matlab来解决在高版本的matlab中已经使用了py36的接口。另一方面可以通过修改python版本来实现通过anconda可以很简便地安装一个新的py版本具体的使用情况可以查看conda的帮助文档。
1. 安装matlab engine的py package
在matlab的官方帮助文档里https://ww2.mathworks.cn/help/matlab/matlab_external/install-the-matlab-engine-for-python.html可以找到
cd matlabroot/extern/engines/python
python setup.py install
即切换到对应matlab的engines目录然后运行安转脚本。需要注意的是在安装之前需要切换py版本到3.4否则默认是base的python那样会出现错误。
2. 在py脚本里调用matlab engine
在matlab 文档 里https://ww2.mathworks.cn/help/matlab/matlab_external/get-started-with-matlab-engine-for-python.html声明了对应的matlab engine的启动和使用其中包含了matlab数据和python数据类型的对应关系。
在文档https://ww2.mathworks.cn/help/matlab/matlab_external/call-matlab-functions-from-python.html里可以更详细地看到如何使用matlab engine
import matlab.engine
eng matlab.engine.start_matlab()
tf eng.isprime(37)
print(tf) #True
上述的例子是调用了matlab的判断素数的接口首先需要在py文件里导入对应的matlab engine包然后调用start_matlab()来启动引擎然后使用引擎来得到返回值需要注意的是eng下的函数调用不会有提示需要参照matlab的接口。
上述的是有返回值的调用当函数具有多个返回值时那么对应的调用方式如下
import matlab.engine
eng matlab.engine.start_matlab()
t eng.gcd(100.0,80.0,nargout3)
print(t)
注意当使用具有多个返回值函数的时候会返回一个python cell对于含有矩阵的数据会转换成python的list数据。
当函数没有返回值时需要使用以下的方式调用
import matlab.engine
eng matlab.engine.start_matlab()
eng.doc(nargout0)
即要声明nargout0此时函数不会返回任何参数如果不声明就会报错。
3. 在python脚本里调用matlab脚本
该文档的帮助信息在https://ww2.mathworks.cn/help/matlab/matlab_external/call-user-script-and-function-from-python.html可以看到有两种方式的调用1.直接调用2.调用函数
如果是直接的脚本比如在triarea.m里写下以下内容
b 5;
h 3;
a 0.5*(b.* h)
那么在python里就可以直接调用
import matlab.engine
eng matlab.engine.start_matlab()
eng.triarea(nargout0)
就会得到py的打印输出a7.5000这是因为虽然无返回值但是matlab的输出仍然会显示在py里。当然更方便的方法是调用函数的形式生成以下的文件
function a triarea(b,h)
a 0.5*(b.* h);
在python中执行以下的调用
ret eng.triarea(1.0,5.0)
print(ret)
就会得到2.5需要注意的是该函数仅返回一个值因此无需指定nargout的值。