为什么R中的矢量索引从1开始,而不是0?

Fra*_*ank 34 arrays r vector

向量索引R开始的原因是什么1,而不是通常的0

例:

> arr<-c(10,20)
> arr[0]
numeric(0)
> arr[1]
[1] 10
> arr[2]
[1] 20
Run Code Online (Sandbox Code Playgroud)

只是他们想要存储关于矢量的额外信息,并且除了作为矢量的第一个元素之外,不知道在哪里存储它?

duf*_*ymo 45

FORTRAN是一种在1开始数组的语言.数学家处理总是从组件1开始并经过N的向量.线性代数约定从行和列开始编号为1并且也经过N.

由于隐含在下面的指针算法,C从零开始.Java,JavaScript,C++和C#也适用于C.

  • 究竟.在我学习指针算法之前,C的0索引对我来说似乎完全没有理由.然后它作为一种设计选择是有道理的. (6认同)
  • @Sharpie,你能解释一下这个评论吗?我对指针有点了解但不跟你说. (5认同)
  • 指针不是唯一的原因; 蟒蛇也开始于零,但它是基于切片而非指针(优雅是主观的过程)的优雅 - https://python-history.blogspot.nl/2013/10/why-python-uses-0-based- indexing.html (2认同)

Jan*_*zny 17

数学中的向量通常表示为n元组,其元素从1到n的索引.我怀疑r想要坚持这种符号.


T.E*_*.D. 9

0只是"通常",因为这就是C所做的,而且许多后来的语言盲目地复制了C语法.默认情况下,Fortran阵列是基于1的.

在Ada中没有默认值,您必须选择beginnning和end范围.有趣的是,似乎我遇到的大多数代码都选择"1"作为下限.我认为这是一个非常好的迹象表明人们可以自由选择的地方.

  • 盲目复制的部分并不完全正确,其他流行语言如 Python 故意选择了 0-based ,因为它使切片更优雅(至少根据创建者的说法)。Dijkstra 遵循类似的优雅论据 https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html (2认同)

goo*_*ide 9

弗兰克,我认为你在输入arr [0]时误解了你所看到的内容.数字(0)只表示结果是没有元素的数字向量.这并不意味着向量的类型被"存储"在元素0中.如果你输入了类型,你会得到相同的结果,例如,arr [arr> 30].没有元素满足该条件,因此结果向量没有元素.同样,没有元素具有索引0.这是有意的,并且与用于其他内容的0空间无关.


ThR*_*R37 5

事实上,我认为当你看看内存的组织方式时,“从 0 开始”的类 C 版本是非常合乎逻辑的。在C中我们可以写如下:

int* T = new int[10];
Run Code Online (Sandbox Code Playgroud)

数组的第一个元素是 *T。这是完全“合乎逻辑的”,因为 *T 是指向的第一个内存实例的地址。第二个元素是第二种情况,所以 *(T+1) :我们向前移动一个“sizeof(int)”。

为了使代码更具可读性,C 为 *(T+i) 实现了一个别名:T[i]。要访问第一个元素,您必须访问 *T,即 T[0]。这是非常自然的。

这个想法由迭代器扩展:

std::vector<int> T(10);
int val = *(T.begin()+3);
Run Code Online (Sandbox Code Playgroud)

T[i] 只是 *(T.begin()+i) 的别名。

在 fortran/R 中,由于数学问题,我们通常从 1 开始,但肯定还有其他不错的选择(例如参见此链接)。不要忘记 fortran 可以轻松使用以 0 开头的数组:

PROGRAM ZEROARRAY
REAL T(0:9)
T(0) = 3.14
END
Run Code Online (Sandbox Code Playgroud)