禁用MATLAB的隐式扩展

时间:2018-03-28 13:09:48

标签: matlab vector addition

最近,在R2016b中,一个功能被添加到MATLAB中,这在我教的学校引起了很多麻烦。

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

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

因此,向列向量添加行向量被视为两个矩阵的相加,可以从重复向量到#34;适当的"尺寸。在旧版本中,这会产生一条错误消息,通知无法添加具有不同尺寸的矩阵。

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

我不认为这是MATLAB语法和行为的有用部分,因为它需要太多的解释,阅读程序员的意图。 repmat是有原因的,可以引入一个专用函数来满足这个东西的需要。

2 个答案:

答案 0 :(得分:6)

正如@PhelypeOleinik所提到的,这是(自R2016b以来)语言的核心部分,并且有充分的理由,如博客文章所述。

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

  1. 在路径的某个位置创建一个文件夹,名为@double
  2. 在此文件夹中,创建一个文件plus.m
  3. 在文件中,输入如下内容:

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

    如果我在上面有评论,你可以放置你喜欢的任何代码:其中可能包含检查"尺寸兼容性"的输入的代码。你想要的规则,如果它没有满足它们的错误。

    为功能minustimesldividerdividepower以及您要修改的其他功能执行类似操作。

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

答案 1 :(得分:5)

此功能是在Matlab R2016b中引入的。在旧版本中,此扩展必须使用bsxfun:P完成。较新的版本具有维度的隐式扩展,以对计算进行矢量化。

In this blog post来自MathWorks的Steve Eddins说:

  

其他人认为新的算子行为不足以基于线性代数符号。然而,不是将MATLAB视为纯线性代数符号,而是将MATLAB视为矩阵和数组计算符号更为准确。

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

当然,从代数的角度来看,这是没有意义的。但是如果你考虑一下,大多数计算机语言符号都没有意义。

由于这是语言的一部分,因此不应该禁用该功能(直到Yair Altman试图这样做Startup.cs)。