Matlab 调用 Python 脚本,,Matlab 调用


Matlab 调用 Python 脚本

最近尝试在 Matlab 环境中调用 Python 脚本,这里总结下碰到的几个问题。

1. Python 模块加载

在 Matlab 函数中,想要将 Python 文件作为模块加载,需要首先修改 Python 环境变量路径

P = py.sys.path;if count(P,modpath) == 0    insert(P,int32(0),modpath);end

修改好路径后,直接使用 import 命令加载 Python 模块会产生错误,需采用以下命令

py.importlib.import_module('analytical_subcritical'); % 加载 python 模块 analytical_subcritical

2. Python 函数调用

在调用 Python 模块中函数时,需将 Matlab 环境中变量转换为 Python 类型的变量传入函数中,部分类型变量可以直接转换,可参考 Matlab 官网—将数据传递给 Python。

在 Matlab 中常用的向量和矩阵转换为 1\(\times\)N 大小可以直接作为 array.array(‘d‘) 类型 Python 变量传入,因此可将输入数据大小转换后直接传入 Python 函数中进行计算。

3. Python 数据处理

在获得 Python 函数返回结果后,需将数据重新转换为 Matlab 类型变量。不同类型变量转换可以参考官网—处理从 Python 返回的数据。

但是这些类型仅为 Python 中部分内建变量类型,对于常用的 Numpy 库返回的 ndarray 类型变量需要进一步转化

value =   Python ndarray with properties:           T: [1×1 py.numpy.ndarray]        base: [1×1 py.NoneType]      ctypes: [1×1 py.numpy.core._internal._ctypes]        data: [1×24 py.buffer]       dtype: [1×1 py.numpy.dtype]       flags: [1×1 py.numpy.flagsobj]        flat: [1×1 py.numpy.flatiter]        imag: [1×1 py.numpy.ndarray]    itemsize: 8      nbytes: 24        ndim: 1        real: [1×1 py.numpy.ndarray]       shape: [1×1 py.tuple]        size: 3     strides: [1×1 py.tuple]    [1 2 3]

对于此类型变量转换过程,目前有两种方法。

第一种方式是将 ndarray 变量转换为 Python 的 array.array 类型,随后可利用 double 函数直接转换为 Matlab 变量。

data = double(py.array.array('d',py.numpy.nditer(value))); %d is for double, value is ndarray

第二种是利用 scipy 库将变量储存为 mat 文件,随后在 Matlab 中加载。

import numpy as npimport scipy.iox = np.linspace(0, 2 * np.pi, 100)y = np.cos(x)scipy.io.savemat('test.mat', dict(x=x, y=y))

相比第二种方法,第一种方法更为直接。转换为 Matlab 变量后利用 reshape 修改向量大小即可。

Matlab 调用 Python 脚本

评论关闭