当前位置: 首页 > news >正文

我的开源项目之Matlab/Octave转Python工具(motopy)

目录

  • Motopy
    • 介绍
    • 安装
    • 快速开始
      • 指定输入输出文件夹
      • 指定替代函数
      • 日志信息
      • 缩进
    • motopy的使用要求
    • 已实现的转换
      • 矩阵, 数组和元胞的创建
      • 矩阵, 数组和元胞的切片
      • 函数
    • 说明

Motopy

介绍

motopy 是一款功能强大(😊自吹吧)的 Matlab/OctavePYthon工具. 在转换的过程中, 自动执行转换后的python语句, 保证转换过程的正确性. 例如下述Matlab/Octave代码:

a = ones(1, 3);
b = a';
c = a * b;

将转换为:

import numpy as np
a = np.ones((1, 3))
b = a.T
c = a @ b

变量 ab 的值类型均为数组类型. 所以在转换第三条语句 c = a * b 时, 将会转换为: c = a @ b.

点击 github链接, 访问我的代码仓库.

安装

使用 pip 安装 motopy.

pip install motopy

快速开始

motopy使用起来及其简单, 首先请准备好你的Matlab/Octave文件, 将脚本文件(*.m)和其调用的函数文件放置在同一个文件夹, 保证你的Matlab/Octave脚本能够正常运行, 并且满足motopy的使用要求. 下面我将给出一个简单的例子:

  • 创建名为"demo"的文件夹.

  • 在"demo"文件夹下, 创建两个.m文件, 文件名分别为"func.m" 和 “func_test.m”, 文件内容如下:

    % file: func.m
    function s = func(a, b)
        s = sqrt(a.^2 + b.^2);
    end
    
    % file: func_test.m
    a = 3;
    b = 4;
    s = func(a, b);
    disp(s)
    
  • 在"demo"文件夹中, 创建一个python脚本文件, 导入motopy, 并调用motopy.make()完成代码的转换. python脚本内容如下:

    import motopy
    motopy.make(entryfile='func_test')
    

    entryfile参数用于指定要转换的m文件的脚本入口(!!注意, 此处不加扩展名!!).

    当然, 你也可以直接在python命令行中执行上述代码. 请保证当前目录是"demo"文件夹.

指定输入输出文件夹

python脚本文件可以不放置到m文件所在文件夹中, 输入的m文件和输出的py文件也可以位于不同的文件夹中. 此时可以使用input_path参数指定输入m文件所在位置, 使用output_path参数指定生成的python文件的输出路径.

import motopy
motopy.make(
    entry_basename='func_test', # no extension
    input_path='输入m文件所在路径', 
    output_path='输出py文件所在路径')

指定替代函数

如果你已经完成了某个函数的转换, 可以通过motopy.make()函数中的 replaced_functions参数指定此函数的替代函数.

import motopy
motopy.make(
    entry_basename='func_test', # no extension
    input_path='输入m文件所在路径', 
    output_path='输出py文件所在路径',
    replaced_functions={
        'func': ('func', 'func') # 
    }
)

replaced_functions参数为一个字典, 键为m文件中出现的函数名, 值为二元元组(模块名, 函数名). 上述示例中, func函数文件将不会再次转换.

什么情况下使用replaced_functions?

  • motopy生成的py文件, 我们对其进行了修改, 并且不希望motopy重新生成它.
  • 对于某些m函数, 我们知道python中有功能一致, 且参数对应的函数与其等价. 比如: ceil <–> np.ceil, 我们可以在replaced_functions中添加'ceil': ('numpy', 'ceil')

日志信息

默认在output_path文件夹下生成名为"motopy.log"日志文件. 可以通过logging_file参数, 指定日志文件的输出位置和名称. 使用logging_level设置日志等级: WARN|INFO|DEBUG

import motopy
motopy.make(.., logging_level=motopy.DEBUG, ..)

缩进

默认生成的py文件使用4个空格进行缩进, 可以通过indent参数指定缩进所需的空格数.

motopy的使用要求

因为motopy采用边转译边执行的方式进行转换. 所以转换可能失败. 为了提高转换的成功率. 请对你的".m"代码进行适当修改.

  • 数组和元胞中的元素请不要使用空格进行分隔. 下述代码是一个错误示例:

    a = [1 2 3; 4 5 6];
    c = {1 2 'abc'};
    
  • 函数文件的名称和函数名必须相同.

  • 数组和元胞应该事先定义, 且分配足够大的空间. 下述代码是一个错误示例:

    for k=1:5
        A(k) = 2*k; % A 在赋值之前没有定义.
    end
    
    A = []; % 虽然定义了A, 但是没有给足够大的空间
    for k=1:5
        A(k) = 2*k; % A的大小在迭代的过程中改变了
    end
    

已实现的转换

矩阵, 数组和元胞的创建

Matlab/OctavePythonNote
a = [1,2,3,4]a = np.array([1, 2, 3, 4])matlab中的数组会被转换为np.array
a = [1,2;3,4]a = np.array([[1, 2], [3, 4]])
a = [1;2;3;4]a = np.array([[1], [2], [3], [4]])
C = {1,2,3;'4',[5,6],{7,8,9}}C = [[1, 2, 3], ['4', np.array([5, 6]), [7, 8, 9]]]matlabcell 会被转换成 python中的list
r1 = 1:10;r1 = arange(1, 11)上限自动+1
N = 10;
r2 = 1:N;
N = 10
r2 = arange(1, N + 1)
zeros(3)np.zeros((3, 3))
zeros(2,3)np.zeros((2, 3))
ones(3)np.ones((3, 3))
ones((2, 3))np.ones((2, 3))

矩阵, 数组和元胞的切片

Matlab/OctavePythonNote
a(1,1)a[0, 0]如果索引为数值, 使用减1后的值替代
a(1,:)a[0, :]
a(:,1)a[:, 0]
a(1, 1:2)a[0, 0:2]
a(1:2, 1)a[0:2, 0]
a(1,2:end)a[0, 1:]
m = 1;
n = 1;
a(m, n*2)
m = 1
n = 1
a[m - 1, n * 2 - 1]
如果索引为变量或表达式, 则对变量或表达式-1

函数

Matlab/OctavePythonNote
acosnp.arccos
asinnp.arcsin
atannp.arctan
ceilnp.ceil
cosnp.cos
diagnp.diag
dispprint
eyenp.eye
expnp.exp
fftnp.fft
fixnp.fix
floornp.floor
fprintf
ifftnp.ifft
invlinalg.inv
linspacenp.linspace
lognp.log
log10np.log10
log2np.log2
ndimsnp.ndim
numelnp.size
pinvlinalg.pinv
ranklinalg.matrix_rank
roundnp.round
sinnp.sin
sortnp.sort
sprintf('%d%s',a, b)f'{a}{b}'
sqrtnp.sqrt
uniquenp.unique

说明

Motopy 目前处于开发阶段, 如果你在使用的过程中发现任何关于motopy的问题, 烦请提交至Issues, 或邮件告知(falwat@163.com), 留言亦可. 我将在后续版本中更新修复. 感谢使用motopy.

相关文章:

  • 一个高效的通用光学卫星数据正射校正程序
  • 工作和学习遇到的技术问题
  • kafka常用命令大全
  • Python数据库操作 ---- pymysql教学
  • 【互联网大厂机试真题 - 科大讯飞】
  • Wider Face+YOLOV7人脸检测
  • 点击化学Alkynyl Myristic COOH,82909-47-5,13-十四炔酸
  • 基于“遥感+”蓝碳储量估算、红树林信息提取实践技术应用与科研论文写作
  • 【算法基础】1.8离散化
  • Mysql导出100万条数据,9种导出方法优缺点和速度、文件大小测试
  • 【华为OD机试真题2023 JAVA】Linux发行版的数量
  • [Pytorch]将自己的数据集载入dataloader
  • 【jQuery超快速入门教程】上篇
  • 进程、线程及python的多线程编程
  • 【ESP 保姆级教程】玩转emqx认证篇④ ——使用 Redis 的密码认证
  • 东莞注塑MES管理系统具有哪些功能
  • 云上的米开朗基罗:在不确定时代,寻找建筑般的确定性
  • CSS 布局 - 水平 垂直对齐
  • 【DevOps实战|基于Jenkins与Gitlab构建企业级持续集成环境系统】(更新中未完成)
  • 【手写 Vue2.x 源码】第二十八篇 - diff算法-问题分析与patch优化