向量索引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.
0只是"通常",因为这就是C所做的,而且许多后来的语言盲目地复制了C语法.默认情况下,Fortran阵列是基于1的.
在Ada中没有默认值,您必须选择beginnning和end范围.有趣的是,似乎我遇到的大多数代码都选择"1"作为下限.我认为这是一个非常好的迹象表明人们可以自由选择的地方.
弗兰克,我认为你在输入arr [0]时误解了你所看到的内容.数字(0)只表示结果是没有元素的数字向量.这并不意味着向量的类型被"存储"在元素0中.如果你输入了类型,你会得到相同的结果,例如,arr [arr> 30].没有元素满足该条件,因此结果向量没有元素.同样,没有元素具有索引0.这是有意的,并且与用于其他内容的0空间无关.
事实上,我认为当你看看内存的组织方式时,“从 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)