Python 与 Matlab、C++ 的交互使用
Python 与 Matlab、C++ 的交互使用
Python 与 Matlab
方法:借助于 matlab 自带的引擎 API
配置
在MATLAB的命令栏输入 matlabroot
可以得到MATLAB的
安装路径,我的安装路径是'D:\Program Files\MATLAB\R2022a'
。
cd matlab路径\extern\engines\python # 即 D:\Program Files\MATLAB\R2022a\extern\engines\python
python setup.py install
测试 python 调用 matlab 函数
- multiplication_matlab.m 文件:一个乘法函数
function a = multiplication_matlab(b,c)
a = b * c
end
- python 主程序:调用上述 matlab 函数
import matlab.engine # import matlab引擎
# 启动一个新的MATLAB进程,并返回Python的一个变量,它是一个MatlabEngine对象,用于与MATLAB过程进行通信。
eng = matlab.engine.start_matlab() # 可以调用matlab的内置函数。
d = eng.multiplication_matlab(3,2) # 可以调用matlab写的脚本函数
print('d', d, type(d))
- 运行 python 结果:
a =
int64
6
d 6 <class 'int'>
注意
- 调用 MATLAB 的函数相对于相同的计算操作可能会慢一些,这是因为在调用 MATLAB 函数时涉及到了更多的处理步骤和资源开销。所以对于简单的函数不建议调用matlab实现。
- 启动引擎
eng = matlab.engine.start_matlab()
的时间开销很大,也存在一些随机性,所以不要每次调用都重新启动引擎 。
python 与 C++
测试
Python 调用 C 函数
- called_c.c:C语言函数
//编译命令 gcc -o libpycall.so -shared -fPIC called_c.c
#include <stdio.h>
int foo(int a, int b){
printf("a:%d, b:%d.", a, b);
return 0;
}
- 在命令行或者终端输入:
gcc -o libpycall.so -shared -fPIC called_c.c
生成libpycall.so动态库文件,之后就可以在Python中调用foo函数。Python文件:py_call_c.py
- 运行py_call_c.py输出:
a:1, b:3
Python 调用 C++ 类
- cpp_called.cpp:C++源文件
//Python调用c++(类)动态链接库
#include <iostream>
using namespace std;
class TestLib
{
public:
void display();
void display(int a);
};
void TestLib::display() {
cout<<"First display"<<endl;
}
void TestLib::display(int a) {
cout<<"Second display:"<<a<<endl;
}
extern "C" {
TestLib obj;
void display() {
obj.display();
}
void display_int(int a) {
obj.display(a);
}
}
- 在命令行或者终端输入编译命令:
g++ -o libpycallcpp.so -shared -fPIC cpp_called.cpp
说明:
fPIC:生成位置无关目标代码,适用于动态连接;
L path:表示在path目录中搜索库文件,如-L.表示在当前目录;
I path:表示在path目录中搜索头文件;
o file:制定输出文件为file;
shared:生成一个共享库文件。
- py_call_c.py:Python文件:
import ctypes
dll = ctypes.cdll.LoadLibrary
lib = dll('./libpycallcpp.so') # 刚刚生成的库文件的路径
lib.display()
lib.display_int(0)
- 运行输出:
First display
Second display:0