当我必须处理数组的一部分(数组 A 的元素 n 到 n+m)时,我从不知道从数组 A 的这一部分(我们称之为 B)生成的数组应该从 1 或 n 开始。我可以使 B 1) 范围从元素 1 到 mn 或 2) 范围从 n 到 n+m。有几次我感到困惑时产生了错误。
如果内存是一个约束,那么 2) 会浪费元素 1 到 n。另一方面,如果我执行 1) 并最终需要使用不同的索引,则更难同时处理 A 和 B。
在 MatLab 中编程时,每种方法有什么好处?
总是从零开始数组索引是有好处的。虽然这是一个约定问题,但根据我的经验,这是一个可以最大限度地减少错误的约定,尤其是与下面闭合、上面开口间隔(如[a, b)
. 这样一个区间的长度是b - a
。由于1
表达式中没有s,所以我不能忘记将它们放入。区间[0, length)
是整个数组:再次,不需要1
s。像这样的偏移量[x, x + sublen)
也不需要任何1
s。使用基于 1 的索引,组合偏移量,如x1
, x2
,x3
需要仔细处理1
s。
虽然其中一些特征可以在基于 1 的索引中获得,但并非所有特征都可以。当整个框架像大多数 C、Python、Java 等一样采用从零开始的索引、下封闭、上开的约定时,您可以愉快地避免在所有函数调用中考虑丢失+ 1
和错误,这- 1
是一个很大的帮助。
我记得在 Fortran 中可以选择使用任何基数作为索引(0、1、-5,等等)。在少数有用的情况下(通常用于使索引围绕 0 对称),可以通过将数组检索包装在函数调用中来实现相同的效果。由于这些情况几乎总是涉及通过网格对连续变量进行建模,因此我经常想让网格间距不同于 1 并在点之间进行插值,为此我绝对需要将其包装在函数调用中。
我不知道 Matlab 给了你一个选择(你说的是 Matlab,对吗?),但考虑到 Matlab 与 Fortran 的关系,这是有道理的。上述论点与优化无关,但如果我的理解是正确的,并且 Matlab 用某种占位符填充未使用的索引,那么从零开始的索引也可以避免这种情况(以及与无意使用相关的错误)占位符,就好像它是真实的一样)。