禁用 MATLAB 的隐式扩展

Disable MATLAB's implicit expansion

最近,在R2016b中,MATLAB增加了一个功能,这让我任教的学校很头疼。

如今,传统上被认为是非法的或至少是阴暗的数学公式被成功执行:

[1, 2] + [3, 4]'    -> [4, 5; 5, 6]
[1, 2]' + [3, 4, 5] -> [4, 5, 6; 5, 6, 7]

因此,将行向量添加到列向量被视为两个矩阵的相加,可以通过重复向量达到 "suitable" 维。在旧版本中,这会产生一条错误消息,告知无法添加不同维度的矩阵。

我认为问 为什么 有点宽泛,但如果您知道原因,我很想知道。相反,我会问,有没有办法禁用此功能?对于新手程序员来说,这是一个充满伤害的世界,因为传统的数学似乎并不一致,而且生成的矩阵经常被忽视,只会在以后导致错误。

我认为这不是 MATLAB 语法和行为的有用部分,因为它需要太多的解释,解读程序员的意图。 repmat是有原因的,可以引入专门的功能来适应这个东西的需要。

此功能是在 Matlab R2016b 中引入的。在旧版本中,必须使用 repmatbsxfun 来完成此扩展。较新的版本具有这种隐式维度扩展以向量化计算。

In this blog post MathWorks 的 Steve Eddins 说:

Other people thought that the new operator behavior was not sufficiently based on linear algebra notation. However, instead of thinking of MATLAB as a purely linear algebra notation, it is more accurate to think of MATLAB as being a matrix and array computation notation.

它在计算环境中确实有意义。我可以说,对于我的使用,这种隐式扩展 确实 经常让事情变得更容易。

当然,从代数的角度来看,这是没有意义的。但是如果你仔细想想,大多数计算机语言符号是没有意义的。

并且由于这现在是语言的一部分,所以应该不可能禁用该功能(直到 Yair Altman 尝试这样做 :P)。

正如@PhelypeOleinik 所提到的,这是(自 R2016b 起)语言的核心部分,并且有充分的理由,详见博客 post 中提到的。

但是,如果您真的想禁用它...

  1. 在您的路径中的某处创建一个名为 @double 的文件夹。
  2. 在此文件夹中,制作一个文件plus.m

在文件中,放入如下内容:

function out = plus(in1, in2)
    % do some things here
    out = builtin('plus', in1, in2)

我在上面有评论的地方,你可以放任何你喜欢的代码:其中可以包括检查输入是否符合你想要的 "size-compatibility" 规则的代码,如果不符合规则,则会出现错误。

对函数 minustimesldividerdividepower 和您要修改的其他函数执行类似的操作。

PS请不要真的这样做,开发人员非常努力地实现了隐式扩展,如果他们看到你这样禁用它,他们会哭的...