禁用MATLAB的隐式扩展

Fel*_*lix 4 matlab vector addition

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

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

[1, 2] + [3, 4]'    -> [4, 5; 5, 6]
[1, 2]' + [3, 4, 5] -> [4, 5, 6; 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

因此,将行向量添加到列向量被视为两个矩阵的相加,从重复向量到"合适"维度可以得到两个矩阵.在旧版本中,这将产生错误消息,通知不可能添加具有不同尺寸的矩阵.

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

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

Sam*_*rts 6

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

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

  1. 在路径的某个位置创建一个名为的文件夹@double.
  2. 在此文件夹中,创建一个文件plus.m.

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

function out = plus(in1, in2)
    % do some things here
    out = builtin('plus', in1, in2)
Run Code Online (Sandbox Code Playgroud)

在上面我有评论的地方,您可以放置​​您喜欢的任何代码:可能包含检查所需"大小兼容性"规则的输入的代码,以及不符合它们的错误.

做了功能类似的东西minus,times,ldivide,rdivide,power要修改等功能.

PS请不要实际执行此操作,开发人员非常努力地实现隐式扩展,如果他们看到您禁用它,他们会哭...

  • 感谢您提供的方法,但对新学生来说“在我们开始实际的 Matlab 之前,让我们首先通过此代码片段覆盖基本的加法运算符隐式扩展属性!” 会不太理想。 (2认同)

Phe*_*nik 5

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

在这篇博文中 ,来自MathWorks的Steve Eddins说:

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

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

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

由于现在这是该语言的一部分,因此不应该禁用该功能(直到Yair Altman尝试这样做:P).