【问题标题】:What are the pros and cons of starting indices at 1 or another value [closed]以 1 或其他值开始索引的优缺点是什么[关闭]
【发布时间】:2013-07-13 21:45:55
【问题描述】:

当我必须处理数组的一部分(数组 A 的元素 n 到 n+m)时,我从不知道从数组 A 的这一部分(我们称之为 B)生成的数组应该从 1 或n.我可以使 B 1) 范围从元素 1 到 m-n 或 2) 范围从 n 到 n+m。在某些情况下,由于我感到困惑而产生了错误。

如果内存是一个约束,那么 2) 会浪费元素 1 到 n。另一方面,如果我执行 1) 并最终需要使用不同的索引,则更难同时处理 A 和 B。

在 MatLab 中编程时,每种方法有什么好处?

【问题讨论】:

  • This 问题是相关的,但不涉及选择做什么的哲学。
  • 这让我想起了关于道路规则的右手与左手交通......
  • Edsger Dijkstra(以 Dijkstra 的算法闻名)没有其他人 a rant 解释了为什么 zero-based indexing 优于基于 1 的计算机索引。我猜想当一个人有选择时,他的推理可以扩展到其他范围。通常这是代码可读性或最小化无关操作的问题。不要过早优化。
  • 投票结束。这个问题的答案只能是意见之争的前奏。

标签: matlab indexing indices


【解决方案1】:

总是从零开始数组索引有好处。虽然这是一个约定问题,但根据我的经验,这是一个可以最大限度地减少错误的约定,尤其是与[a, b) 等下闭、上开区间结合使用时。这种间隔的长度是b - a。由于表达式中没有1s,所以我不能忘记把它们放进去。区间[0, length)是整个数组:同样,不需要1s。像[x, x + sublen) 这样的偏移量也不需要任何1s。使用基于 1 的索引,组合诸如 x1x2x3 之类的偏移量需要仔细处理 1s。

虽然其中一些特征可以在基于 1 的索引中获得,但并非所有特征都可以。当整个框架像大多数 C、Python、Java 等一样采用从零开始的索引、close-below、open-above 约定时,您可以愉快地避免考虑遗漏+ 1- 1 错误你的函数调用,这是一个很大的帮助。

我记得 选择 在 Fortran 中使用任何基数作为索引(0、1、-5 等等)。在少数有用的情况下(通常用于使索引围绕 0 对称),可以通过将数组检索包装在函数调用中来实现相同的效果。由于这些情况几乎总是涉及通过网格对连续变量进行建模,因此我经常想让网格间距不同于 1 并在点之间进行插值,为此我绝对需要将其包装在函数调用中。

我不知道 Matlab 给了你一个选择(你说的是 Matlab,对吗?),但考虑到 Matlab 与 Fortran 的关系,这是有道理的。上述论点与优化无关,但如果我的理解是正确的,并且 Matlab 用某种占位符填充未使用的索引,那么从零开始的索引也可以避免这种情况(以及与无意使用相关的错误)占位符,就好像它是真实的一样)。

【讨论】:

  • 我正在使用 matlab。我不认为 matlab 确实让您可以选择使用零作为起点。很遗憾,因为我可以看到您在上面描述的优势。我的预期用途比您描述的要有限。如果我想使用数组 A 中的元素 20 到 30 并将它们放入数组 B 中,我应该在 B 中使用元素 20 到 30 以便它与 A 兼容,还是应该使用元素 1 到 11?这更清楚吗?我不是指所有数组的一般规则。
  • 那么您的问题是关于使用 1 而不是大于 1 的某个值的相对值?据我所知,只有音乐家从 2 点开始数...
  • 我总是发现自己在做这种分析,比如说查看上午 9 点到 10 点之间的所有数据或其他什么。
  • 虽然我会抱怨缺少基于 0 的索引,但我个人会将 A 的元素 20 到 30 移动到 B 的 1 到 11 中。用占位符填充 1 到 19 不仅仅是内存浪费 - - 这很危险。这些虚假值可能会被误认为是真实值而无需 Matlab 的投诉。至少,数组索引错误会导致异常或某种中断,从而提醒您该错误。对于这类工作,嘈杂的错误比无声的错误要好。
  • 你说得很好。但另一方面,每次我想使用数组 A 或任何类似数组中的数据时,我都需要使用指针从正确的索引开始。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2016-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2014-06-26
相关资源
最近更新 更多