R語言中矩陣、向量在記憶體上的區別
阿新 • • 發佈:2019-02-05
向量
在初始建立時,系統就給分配了足夠的空間,沒有賦值的下標對應的值都用NA代替了,所以向量不存在下標超出的限制比如:
> x
[1] 1 2
> length(x)
[1] 2
> x[100]
[1] NA
> length(x)
[1] 2
> x[100]=3
> length(x)
[1] 100
建立x時給了兩個數字,所以長度為2。但是取值x[100]時顯示的是NA並非下標越界,當賦值x[100]=3時,x的長度變為了100。
這種性質的好處就是可以取代向量的重新賦值語句比如:
>x<- c(x,2)
可以使用以下語句代替:
>x[length(x)+1]=2
這樣的好處就是由於不用重新賦值,不需要重新分配記憶體,因此可以大大提升程式的效率,比如:
> create_vector2<-function(k)
+ {
+ gh=c()
+ for(i in 1:k){
+ gh=c(gh,i)
+ }
+ return(gh)
+ }
> create_vector1<-function(k)
+ {
+ gh=c()
+ gh[1:k]=1:k
+ return(gh)
+ }
以上為兩個建立向量的函式,執行時間測量如下:
> system.time(create_vector1(10000)) #建立10000長度的向量,函式1執行時間 使用者 系統 流逝 0 0 0 > system.time(create_vector2(10000)) #建立10000長度的向量,函式2執行時間 使用者 系統 流逝 0.11 0.00 0.11 > system.time(create_vector1(100000)) #建立100000長度的向量,函式1執行時間 使用者 系統 流逝 0 0 0 > system.time(create_vector2(100000)) #建立100000長度的向量,函式1執行時間 使用者 系統 流逝 11.48 0.01 11.71
可以看到函式1明顯比函式2快很多。函式1的執行時間基本為0。
矩陣
矩陣並沒有這種性質,矩陣的記憶體空間是初始建立空間的大小。一但確定,只有通過重新賦值來改變。所以會出現下標越界等錯誤。