跳转至

MATLAB 模块化编程

又名:这还是我认识的那个 MATLAB 吗

本文介绍了 MATLAB 中,有助于模块化编程的内容。

inputParser

推荐使用 MATLAB 版本:R2021a

R2021a 中正式推出了键值对调用。在此之前,学 MATLAB 的同学大多数是这么搞的

printPhoto('myfile.jpg','height',10,'width',8)

但现在可以直接这样写,

printPhoto('myfile.jpg',height=10,width=8)

Very Pythonic。

Function Signature

以往都是通过 F1 查看提示,通过 ctrl+D 查看函数源码。但现在,MATLAB 允许通过 json 格式配置函数提示,以实现在函数内

https://ww2.mathworks.cn/help/matlab/matlab_prog/customize-code-suggestions-and-completions.html

Function Argument Validation

Introduced in: R2019b

看这代码的简洁程度就能激发学习的动力!

function ret = example( inputDir, proj, options )
%EXAMPLE An example.
% Do it like this.
% See THEOTHEREXAMPLE.
% See https://stackoverflow.com/a/60178631/20148196
    arguments
        inputDir (1, :) char
        proj (1, 1) projector
        options.foo char {mustBeMember(options.foo, {'bar' 'baz'})} = 'bar'
        options.Angle (1, 1) {double, integer} = 45
        options.Plot (1, 1) logical = false
    end

    % Code always follows 'arguments' block.
    ret = [];
    switch options.foo
        case 'bar'
            ret = sind(options.Angle);
        case 'baz'
            ret = cosd(options.Angle);
    end

    if options.Plot
        plot(proj.x, proj.y)
    end

end

可以看到问题的关键,包括变量类型、数组形状、可选参数,都在于 arguments 代码块。

参考:https://ww2.mathworks.cn/help/matlab/ref/arguments.html。官方文档已经写得很详细了。

模块化编程(package)

将一系列函数包含到一个模块中,模块是一个 + 开头的文件夹,文件夹中有 .m 文件。

面向对象

面向对象由 @example 文件夹、example.m 文件组成,@example 内的所有文件都是 example 这个类的方法。

方法第一个参数是该类的实例,有两种调用方式(与 GoLang 十分类似)

  • robot.teach()
  • teach(robot)

(实例来自 Robotic Toolbox1

https://ww2.mathworks.cn/company/newsletters/articles/introduction-to-object-oriented-programming-in-matlab.html

其他

Live Script

一个比较老的特性,和 Jupyter Notebook 非常类似,但个人感觉 MATLAB 功能更加强大。

Implicit Expansion

同 NumPy 的广播(broadcast),从 2016b 开始支持。

比内置编辑器好用一万倍的 VS Code 扩展

matlab-vscode{loading=lazy}

说了这么多,我们灵活使用 MATLAB 的唯一阻碍就是那个非常难用的内置编辑器了。现在,这种情况已经得到了改观——MathWorks 官方为 VS Code 提供了扩展。不仅有非常优雅的界面,而且拥有悬浮提示、代码片段、打开源码等功能。虽然到 2023 年 5 月还没有调试运行功能,但已经让人满意了。

为啥要折腾这么多

MATLAB 一直被语法问题和工程性不足而饱受诟病2,但最近的更新,尤其是近三年的更新,让我看 到了这门语言的发展希望。

作为程序员,切实的好处是,终于不用被 MATLAB 那古老的语法问题而限制手脚了……

毕竟,MATLAB 官方的专业程度恐怕是 NumPy 比不上的。虽然 PyTorch 能在 Deep Learning 上超过 MATLAB。

缺点

MATLAB 尚未计划推出类似于 Python Type Hint3,语法级别的支持恐怕是要再等等,不过现在相比以前已经很令人满意了~


  1. Robotics Toolbox, Peter Corke. https://petercorke.com/toolboxes/robotics-toolbox/ 

  2. MATLAB is a terrible programming language, Nikolaus Rath‘s Website. https://www.rath.org/matlab-is-a-terrible-programming-language.html 

  3. PEP 484 -- Type Hints, Guido van Rossum et al. https://peps.python.org/pep-0484/