前言
本文是一次python调用matlab编译成的动态链接库的简单尝试,为了有需求的朋友可以学习如何完成自己matlab代码的编译和python调用,主要用于某些项目不方便安装matlab运行环境的情况。
本文主要是实现用python调用matlab写的加法函数,主要流程如下:
![](https://img-blog.csdnimg.cn/img_convert/d64408d62cb0ce66e10c4899e547f93e.png)
2. MATALB编译为动态链接库dll
这部分介绍如何利用MATLAB Coder工具实现addition函数的编译。
2.1 addition.m函数和test.m测试程序
addition.m函数,主要输出a+b的值。
function out = addition(a, b)
s = a + b;
out =s;
end
test.m测试程序,用于MATLAB Coder测试addition函数。
a=1;
b=1;
c = addition(a,b);
2.2 MATLAB Coder编译addition.m函数
采用MATLAB Coder编译addition.m函数的主要步骤包括:
(1)打开addition.m和test.m所在文件夹,并打开MATLAB Coder APP。
![](https://img-blog.csdnimg.cn/img_convert/48f6bc5286e2ac2f2eec47abf20faaf1.png)
(2)输入要编译的函数名,本文为addition.m函数,输入后点击Next。
![](https://img-blog.csdnimg.cn/img_convert/ae4dffd2eaa9d77f35b21fa4e681395a.png)
(3)点击Next。
![](https://img-blog.csdnimg.cn/img_convert/d2927da112f790dbdf5f62a22fceb485.png)
(4)输入测试脚本名称,本文为test.m文件,输入后按回车键,出现addition.m函数两个输入形参及其类型。
![](https://img-blog.csdnimg.cn/img_convert/15e808f67607d8eb3b77772199015dca.png)
(5)根据实际需求,选择addition.m函数两个输入形参类型,本文为double类型,完成后点击Next。
![](https://img-blog.csdnimg.cn/img_convert/072e0339d14d465db415ceab36a023b2.png)
(6)点击“Check for Issues”按键,进行错误检查,检查无误后如下图。
![](https://img-blog.csdnimg.cn/img_convert/d1419b882898d62e78c4fdc63ab70b39.png)
![](https://img-blog.csdnimg.cn/img_convert/f7ba3918cbf930919bf0f0e6fa68285a.png)
(7)选择“Build type”,可以为C/C++源代码,本文为动态链接库(Dynamic Librery),选择完成后点击“Generate”按钮,完成编译。
![](https://img-blog.csdnimg.cn/img_convert/bdddba9d81f30ca0770b5224390aa46b.png)
(8)编译完成后,出现预览界面,点击Next,完成本次编译。
![](https://img-blog.csdnimg.cn/img_convert/f18592469dc3ed9b53aa5178af3ad734.png)
![](https://img-blog.csdnimg.cn/img_convert/33bf39138028ea5c5ad6ff66b19f3eb8.png)
![](https://img-blog.csdnimg.cn/img_convert/0aa890908666cc3845a15d0bec1ca001.png)
3 python调用addition.dll动态链接库
3.1 复制addition.dll动态链接库
将addtion.dll动态链接库复制到与toMatdll.py脚本同一文件夹,方面演示和调用。
![](https://img-blog.csdnimg.cn/img_convert/7de2fb759feb58742959ea66990ad91b.png)
3.2 创建toMatdll.py函数
toMatdll.py代码如下,使用ctypes库进行调用。
from ctypes import *
dll = CDLL(r"./addition.dll")
dll.addition.restype = c_double #设置函数输出
sum = dll.addition(c_double(1),c_double(2))
print(sum)
下面分别说明每一部分内容:
3.1.1 创建连接
dll = CDLL(r"./addition.dll")
3.1.2 设置输出格式
输出格式为double类型,若不设置输出格式,输出结果会出错。
dll.addition.restype = c_double #设置函数输出
3.1.3 传入计算参数
注意传入的每个参数都要给定参数类型,类型与编译时选择的参数类型一致,具体类型见下表。
sum = dll.addition(c_double(1),c_double(2))
![](https://img-blog.csdnimg.cn/img_convert/4726348830bac5da133935df9ff38bb8.png)
ctypes tpye
3.1.4 调用计算结果
调用后的输出结果为3.0。
![](https://img-blog.csdnimg.cn/img_convert/8f1fc60e16f2145ade8183afde0231ac.png)
4 输出数值不对错误
由于没有设置输出数据类型,添加上输出类型设置语句即可。
![](https://img-blog.csdnimg.cn/img_convert/7da3ac1b1a8529854367baf1c49efda9.png)
5总结
本博客只是对python调用matlab编译的动态链接库的一次简单尝试,但其他matlab函数编译基本原理一致,具体能编译的函数见MathWorks。