罗兰关于MATLAB的艺术

将想法转化为MATLAB

更多关于隐性扩张的想法

更多关于隐性扩张的想法

Steve Eddins带来了另一篇关于隐性扩张的深思熟虑的文章。

一些人已经表达了一些担忧,因为引入在MATLAB R2016b中隐式展开

通常,人们会担心两个相同长度的向量的元素加法,一个b,没有意识到一个是行向量,另一个是列向量。MATLAB R2016b将产生一个矩阵,而早期版本的MATLAB产生了一个错误。问题是,用户可能没有意识到计算不是他们想要的,或者用户可能会耗尽内存一个b真的很长。

表达这种担忧的人有时会建议在添加行向量和列向量的情况下添加某种警告。

这是一个合理的担忧,在考虑隐性扩张的那些年里,这也是一个被讨论过多次的问题。

我们有几个理由认为,这种非预期的计算在实践中不会是一个重大问题。首先,我们不认为无意识的计算会被忽视。对于命令窗口中的交互式计算,很明显计算产生了一个矩阵而不是一个向量。对于脚本或函数中的代码,如果后续代码期望得到n元素向量,那么如果得到的是NxN矩阵,那么很可能会出现错误或明显不同的情况。相对于输入当你的意思.*,或而不是.'时,向量的隐式展开误差更容易识别。

第二个原因是,在我们在MathWorks的内部经验中,我们没有看到这个问题突然成为一个重大问题。MATLAB的内部开发构建从2015年10月开始使用隐式扩展。我们已经看到,人们通常会很快适应新的行为。他们开始使用它,停止过度思考。

此外,我们不认为内存不足会是一个大问题。在过去的几个版本中,MATLAB有一个用户可设置的数组元素数量上限。限制的目的是为了防止试图制造一个太大的阵列,使您的计算机研磨到一个交换引起的停止。这个特性的引入极大地影响了我们进行隐式扩展的最终决定。

引入警告信息的想法被证明是不可行的,原因有几个。首先,对于MATLAB来说并没有一个好的方法来确定你是否想要输入一个矩阵行+坳.两个向量的成对和,你可能会认为是外部和,实际上是一种常见的计算模式bsxfun是用于。因此,当正确使用算术运算符时,可能会出现任何警告消息。

可以理解的是,MATLAB用户不能容忍在正确使用时产生警告消息的代码,因此,任何编写数学代码的人都需要编写额外的代码来保存警告状态,抑制警告消息,然后恢复警告状态。这是很多执行缓慢的机器来包装简单的矩阵运算。

此外,警告生成逻辑严重干扰了我们生成超快数学计算的能力,这种计算完全利用了优化的处理器指令集、指令流水线和多核。将警告逻辑添加到基本MATLAB算法的实现中会导致不可接受的慢下来。

这与MATLAB Math团队近年来实际上删除了一些警告消息的原因是相同的。最著名的例子是MATLAB不再生成的旧的零除法警告。

总而言之,虽然我们承认内隐扩展行为在某些情况下可能会引起混淆,但根据我们的经验,我们相信这不会是一个大问题。我们对使用的观察repmatbsxfun多年来,我们得出这样的结论:总的来说,隐性扩张的好处将大大超过坏处。最后,我们认为某种警告信息既不可行也不可取。




发布与MATLAB®R2016b

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。