MaToPy,一套自动将 Matlab 代码转为 Python 代码的编译器和运行时函数库。

可以将 Matlab 代码自动转译为 Python 代码,得到的 Python 代码和 Matlab 代码相似,便于维护。

为何选择 MaToPy

Python 算法打包后只有 70M 字节,相比起来非常小,且 Python 在科学计算领域有丰富的开源生态, 也有很多并行加速计算的技术,对 AI 支持良好,具有较大潜力。

MaToPy 包含一个编译器Python运行库, 可以节省您大量的 Matlab 转 Python 开发和调试时间,对大中型的 Matlab 算法项目尤其方便。 代码转换准确率高,减少了转换后 python 代码的修改和调试工作量,并且 MaToPy 还具备以下优点。

安全可靠

您的Matlab代码将通过您本地的 MaToPy 编译器转译,所有计算都在本地机器完成,代码无需上传到服务器,避免安全隐患。 编译器基于计算机编译原理开发,稳定性高,可靠性强,有效降低代码泄露的风险。

遵循Matlab约定

MaToPy 的运行库虽然是 Python 语言的,但使用了和 Matlab 一样的习惯约定,例如下标是从 1 开始的而不是 0, 函数的名称、参数与 Matlab 相似, 让熟悉 Matlab 的用户使用 MaToPy 运行库更容易上手,对比 Matlab 和 Python 代码更加便捷。

容易扩展

MaToPy 还在不断扩展支持的 Matlab 函数库,基于已有的 MaToPy 矩阵运算库,可以方便地实现新的 Matlab 函数。 因为 Python 拥有丰富的科学计算生态和众多开源库,如 numpy、pandas、scipy、pytorch、tensorflow 等,是在科学计算领域具有重要地位的语言之一。 因此基于 MaToPy 和丰富的 Python 生态库,能够便捷地实现各种 Matlab 的函数。

MaToPy 转换示例

MATLAB 代码


function [name, name2, name3] = test_matopy(f)
    
	% 函数调用
	% 如果与 python 内建函数名冲突,则加 m_ 前缀,例如 dir 会翻译为 m_dir 函数。
	name = dir(f);

	% 自动添加返回值个数参数 nargout,让 python 函数知道本次调用需要返回的变量个数
    [turnout_result,turnout_info] = sub_analysis(fname0,line_name,tz_turnout);

    % 创建数组
    A = [1 2 3]

    % 串联矩阵
    B = [A, 4, 5]
    B = [A 4 5]

    % 垂直串联矩阵。
    C = [A; 4 5 6]

    % 复杂一些的矩阵组合
    D = [1 2 3;
         4 5 6]

    % 更复杂的二维矩阵创建
    F = [a-b(), c(1:2); d(1,2), e];

    % 支持字符向量串联
    dir([fname_dir0 '*.geo'])

    % 条件索引
    id_tmp=find(wdisp_ver>=mile_sw0 & wdisp_ver<=mile_sw1);

    % 逻辑运算:元素或运算
    indmin = find(d1.*d2<0 & d1<0)+1;

    % if 表达式
    if ic0 > 10 | ic1 > 10
        a = 1;
    end

    % & | 混排的表达式,优先级就很重要了
    a = d1 | d2 & d3
    b = d1 && d2 & d3

MaToPy

Python 代码


@function
def test_matopy(f=None,*args,**kwargs):
	varargin = test_matopy.varargin
	nargin = test_matopy.nargin

	# 函数调用
	name=m_dir(f)

	# 自动添加返回值个数参数 nargout,让 python 函数知道本次调用需要返回的变量个数
	turnout_result,turnout_info=sub_analysis(fname0,line_name,tz_turnout,nargout=2)
	
	# 创建数组
	A=horzcat(1,2,3)

	# 串联矩阵
	B=horzcat(A,4,5)
	B=horzcat(A,4,5)

	# 垂直串联矩阵。
	C=vertcat(A, horzcat(4,5,6))
	
	# 复杂一些的矩阵组合
	D=vertcat(horzcat(1,2,3), horzcat(4,5,6))
	
	# 更复杂的二维矩阵创建
	F=vertcat(horzcat(a - b(),c(arange(1,2))), horzcat(d(1,2),e))
	
	# 支持字符向量串联
	m_dir(horzcat(fname_dir0,'*.geo'))
	
	# 条件索引
	id_tmp=find(logical_and(wdisp_ver >= mile_sw0,wdisp_ver <= mile_sw1))
	
	# 逻辑运算:元素或运算
	indmin=find(logical_and(times(d1,d2) < 0,d1 < 0)) + 1
	
	# if 表达式
	if logical_or(ic0 > 10,ic1 > 10):
		a=1
	
	# & | 混排的表达式,优先级就很重要了
	a=logical_or(d1,logical_and(d2,d3))
	b=d1 and logical_and(d2,d3)
	
	# 自动创建返回变量语句
	return name,name2,name3
	

关于试用

MaToPy 目前处于测试、试用阶段,只实现了部分 Matlab 的函数, 其他函数需要自己实现,要求熟悉 Matlab、MaToPy 函数库、numpy 和 python 开发,否则也无法达到期望的结果。

另外,MaToPy 编译得到的 Python 代码,需要手工调整、调试,如果不熟悉 Python 开发调试技术、 MaToPy 函数库(尤其是 matlabarray 类的用法)和 Matlab 也无法得到可运行的结果。

如果您对 MaToPy 感兴趣,请仔细阅读“免责声明”和“使用许可”,如果同意,欢迎联系我们获取试用版本,

我们的邮箱是 contact@telecwin.com; 联系微信号是 ipandabot,添加微信时请注明“咨询 MaToPy”,感谢您的关注!

联系我们获取试用版本将视为您已经阅读并同意“免责声明”、“使用许可”,如果不同意请勿联系。