Python 与 Matlab、C++ 的交互使用

Python 与 Matlab、C++ 的交互使用

Python 与 Matlab

方法:借助于 matlab 自带的引擎 API

与 MATLAB 产品兼容的 Python 版本(按版本)

配置

在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 函数

  1. multiplication_matlab.m 文件:一个乘法函数
function a = multiplication_matlab(b,c)
	a = b * c
end
  1. 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))
  1. 运行 python 结果:
a =

  int64

   6

d 6 <class 'int'>

注意

  • 调用 MATLAB 的函数相对于相同的计算操作可能会慢一些,这是因为在调用 MATLAB 函数时涉及到了更多的处理步骤和资源开销。所以对于简单的函数不建议调用matlab实现。
  • 启动引擎 eng = matlab.engine.start_matlab() 的时间开销很大,也存在一些随机性,所以不要每次调用都重新启动引擎 。

python 与 C++

测试

Python 调用 C 函数

  1. 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;
}
  1. 在命令行或者终端输入:
gcc -o libpycall.so -shared -fPIC called_c.c

生成libpycall.so动态库文件,之后就可以在Python中调用foo函数。Python文件:py_call_c.py

  1. 运行py_call_c.py输出:
a:1, b:3

Python 调用 C++ 类

  1. 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);
      }
}
  1. 在命令行或者终端输入编译命令:
g++ -o libpycallcpp.so -shared -fPIC cpp_called.cpp

说明:

  • fPIC:生成位置无关目标代码,适用于动态连接;

  • L path:表示在path目录中搜索库文件,如-L.表示在当前目录;

  • I path:表示在path目录中搜索头文件;

  • o file:制定输出文件为file;

  • shared:生成一个共享库文件。

  1. py_call_c.py:Python文件:
import ctypes
dll = ctypes.cdll.LoadLibrary
lib = dll('./libpycallcpp.so') # 刚刚生成的库文件的路径
lib.display()
lib.display_int(0)
  1. 运行输出:
First display
Second display:0

参考