为什么Matlab采用以1为基数的索引?

17

我之前使用Java和Python进行编程,但最近开始在很多事情上使用MATLAB(特别是计算机视觉算法)。

然而,MATLAB的数组索引从1开始,而不是像几乎所有我遇到过的编程语言那样从0开始。

我认为0索引的原因是这样的:在我看到的每个处理器中,地址索引都从0x00000000开始,比如一个8位处理器,如果我想保存5个数字,它们将存储在地址0x00000000到0x00000004。因此,在编程语言中使用从0开始的索引是有意义的。

当我搜索这个问题时,我发现List of 1-indexed programming languages?http://en.wikipedia.org/wiki/Comparison_of_programming_languages_(array) 这两个链接很有用。

对于我来说,这不是很方便的表示方法,可能是因为我以前使用其他语言编码。但我仍然不明白为什么MATLAB(甚至是Julia)具有基于1的数组索引,提供了哪些优势。有人能列出一些优点吗?


5
MATLAB(矩阵实验室)通常遵循数学/线性代数约定,而不是计算机科学约定。在矩阵中,第一个元素,即左上角的元素,是(1,1)元素,而不是(0,0)元素,因此使用基于 1 的索引而不是基于 0 的索引。 - Phil Goddard
3
我认为这与MATLAB最初的基础是用Fortran编写的有关,Fortran也具有从1开始索引的特点。这个问题已经在Usenet上争论了很久,因此通过谷歌搜索可以找到更多细节。无论如何,我投票关闭此问题,因为真正的答案在Cleve Moler的头脑中。即使有人能够提供权威参考来解释为什么会出现这种情况,这个问题对于SO来说仍然不是主题。同时,如果你要使用MATLAB,就要习惯它并处理它;这就是我们其他人所做的。 - Praetorian
在一个数字列表中,比如45、17、94、37,我认为列表中的第一个数字是45。从概念上讲,谈论零号数字对我来说没有多少意义。仅仅因为这个原因,我喜欢基于1的索引。正如Phil所说,这反映了数学符号表示法,这也是Matlab的主要(?)预期用途。 - David
2个回答

28

为什么它采用基于1的索引?历史原因。(Cleve Moler决定如此)。这可能与基于1的索引是矩阵表示法的惯例有关。

为什么它不实现基于0的索引呢? 想要一些轻松愉快的阅读吗?

特别是,寻找Cleve Moler(MATLAB的创建者)和Steve Lord(MathWorks工程师)的评论。在经过多次交流后,至少在2001年,不实现补充基于0的索引并不是出于哲学或兼容性原因,虽然最初是基于向后兼容性的论点,但因为需要更新MATLAB内置函数而需要付出太多的努力:

他们不想编写所有新的绘图、打印等程序。

我同意可以向 MATLAB 添加从零开始的索引,使用新符号或重载我们所有现有的索引符号的对象。它可以向后兼容,也就是说,不知道或不使用新内容的旧代码仍将工作。

但这是关键点:我们所有现有的代码都无法与新对象一起使用。您不能绘制它;您不能打印它;您肯定不能对其进行任何矩阵操作。是的,随着时间的推移,可以重新编写所有东西以处理扩展,但这就是我们要避免的。这就像 AM 和 FM 电台 - 两个系统共存于同一盒子中,但具有独立的底层技术。

-- Cleve Moler
moler@mathworks.com

翻译:他们不想编写所有新的绘图、打印等程序。


我实际上读了这篇“轻松愉快的阅读”。讨论基于0和1的索引的重要性是一个非常有趣的话题。 - opto abhi
但不幸的是,链接已经失效了。该页面现在只显示“自2017年12月起,新闻阅读器应用程序已关闭。” - 张实唯
2
@张实唯 更新了链接。 - chappjc

11
Matlab旨在让那些未学习编程的人能够使用编程语言的功能。对于不熟悉编程的人来说,索引从0开始可能是常见的错误来源,Matlab的整个目的就是使人们能够将他们理解的数学应用于需要解决的问题,而不需要太多其他知识。
Matlab通常用于物理和工程等任务,这些领域中的文献大多采用从1开始的索引约定,因此在这些领域工作的人不需要通过减去1来转换他们的算法。
此外,Matlab是“矩阵实验室”的缩写,在数学中,惯例是从1开始索引矩阵,因此遵循这种惯例是有道理的。
你认为从0开始索引的理由完全正确,但高级语言如Matlab的目的是隐藏用户不需要了解的方面。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接