禁用 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 中引入的。在旧版本中,必须使用 repmat
或 bsxfun
来完成此扩展。较新的版本具有这种隐式维度扩展以向量化计算。
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 中提到的。
但是,如果您真的想禁用它...
- 在您的路径中的某处创建一个名为
@double
的文件夹。
- 在此文件夹中,制作一个文件
plus.m
。
在文件中,放入如下内容:
function out = plus(in1, in2)
% do some things here
out = builtin('plus', in1, in2)
我在上面有评论的地方,你可以放任何你喜欢的代码:其中可以包括检查输入是否符合你想要的 "size-compatibility" 规则的代码,如果不符合规则,则会出现错误。
对函数 minus
、times
、ldivide
、rdivide
、power
和您要修改的其他函数执行类似的操作。
PS请不要真的这样做,开发人员非常努力地实现了隐式扩展,如果他们看到你这样禁用它,他们会哭的...
最近,在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 中引入的。在旧版本中,必须使用 repmat
或 bsxfun
来完成此扩展。较新的版本具有这种隐式维度扩展以向量化计算。
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 中提到的。
但是,如果您真的想禁用它...
- 在您的路径中的某处创建一个名为
@double
的文件夹。 - 在此文件夹中,制作一个文件
plus.m
。
在文件中,放入如下内容:
function out = plus(in1, in2)
% do some things here
out = builtin('plus', in1, in2)
我在上面有评论的地方,你可以放任何你喜欢的代码:其中可以包括检查输入是否符合你想要的 "size-compatibility" 规则的代码,如果不符合规则,则会出现错误。
对函数 minus
、times
、ldivide
、rdivide
、power
和您要修改的其他函数执行类似的操作。
PS请不要真的这样做,开发人员非常努力地实现了隐式扩展,如果他们看到你这样禁用它,他们会哭的...