zoukankan      html  css  js  c++  java
  • Matlab 调用 Python 脚本

    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( imes)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 np
    import scipy.io
    x = np.linspace(0, 2 * np.pi, 100)
    y = np.cos(x)
    scipy.io.savemat('test.mat', dict(x=x, y=y))
    

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

  • 相关阅读:
    Constraint.constant动画效果
    poj3469 Dual Core CPU --- 最小割
    开发Blog整理
    Android 四大组件学习之BroadcastReceiver四
    在光标处插入指定文本(支持文本域和文本框)
    图片显示插件
    Extjs4 自定义组件
    Windows英文版GitHub客户端使用操作流程图文攻略教程现没中文版
    innerHTML和innerText怎么区分
    button和input type=button的区别及注意事项
  • 原文地址:https://www.cnblogs.com/li12242/p/10766035.html
Copyright © 2011-2022 走看看