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

6 篇文章 0 订阅
4 篇文章 1 订阅

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.

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

falwat

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值