2016-03-08 32 views
0

我有這樣的矩陣:如何與迴路和相同的值填充矩陣式柱

mat_A <- matrix(ncol=7,nrow=12) 

我將填補的mat_A列有用於每列相同的值,在值的範圍爲5至11。預期的結果是:

 [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
[1,] 5 6 7 8 9 10 11 
[2,] 5 6 7 8 9 10 11 
[3,] 5 6 7 8 9 10 11 
[4,] 5 6 7 8 9 10 11 
[5,] 5 6 7 8 9 10 11 
[6,] 5 6 7 8 9 10 11 
[7,] 5 6 7 8 9 10 11 
[8,] 5 6 7 8 9 10 11 
[9,] 5 6 7 8 9 10 11 
[10,] 5 6 7 8 9 10 11 
[11,] 5 6 7 8 9 10 11 
[12,] 5 6 7 8 9 10 11 

我知道我可以通過塔板科拉姆,如:

mat_A[,1] <- 5 
.... 
mat_A[,7] <- 11 

但是,爲什麼我能做到這一點與循環for? 我試着用:

pippo <- rep(5:11,each=12) 
    for(j in 1:ncol(mat_A)){ 
    mat_A[j,] <- pippo 
    } 

但錯誤是:

Error in mat_A[j, ] <- pippo : 
    number of items to replace is not a multiple of replacement length 

任何想法?

+0

這個'rep(5:11,each = 12)'多久了?這個'mat_A [j,]'多久了?這就是爲什麼你的代碼失敗。 – arvi1000

回答

3

你不需要循環。嘗試

mat_A <- matrix(ncol=7,nrow=12) 
mat_A <- col(mat_A)+4 
mat_A 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] 
# [1,] 5 6 7 8 9 10 11 
# [2,] 5 6 7 8 9 10 11 
# [3,] 5 6 7 8 9 10 11 
# [4,] 5 6 7 8 9 10 11 
# [5,] 5 6 7 8 9 10 11 
# [6,] 5 6 7 8 9 10 11 
# [7,] 5 6 7 8 9 10 11 
# [8,] 5 6 7 8 9 10 11 
# [9,] 5 6 7 8 9 10 11 
#[10,] 5 6 7 8 9 10 11 
#[11,] 5 6 7 8 9 10 11 
#[12,] 5 6 7 8 9 10 11 

另外,如果你想使用作爲OP描述的循環中,代碼可以在兩個修改後使用:

  1. 刪除each=12,並
  2. 遍歷行,而不是列。

因此,這個工作,也:

pippo <- rep(5:11) 
for(j in 1:nrow(mat_A)){ 
    mat_A[j,] <- pippo 
} 
1

你可以簡單的構建矩陣:

mat_A <- matrix(rep(5:11, each=12), 12) 

這裏微基準測試的三個答案的結果:

> library(microbenchmark) 
> microbenchmark(
+ by.row= matrix(5:11,ncol=7,nrow=12,byrow=TRUE), 
+ rep=matrix(rep(5:11, each=12), 12), 
+ col.plus=col(matrix(ncol=7,nrow=12))+4, 
+ loop={mat_A <- matrix(ncol=7,nrow=12); pippo <- rep(5:11); for(j in 1:nrow(mat_A))  mat_A[j,] <- pippo } 
+) 
Unit: microseconds 
    expr min  lq  mean median  uq max neval cld 
    by.row 2.681 2.9505 3.27668 3.0955 3.3025 14.087 100 a 
     rep 3.780 4.0580 4.26584 4.2170 4.3485 5.707 100 ab 
col.plus 4.230 4.5000 4.81078 4.6905 4.8680 10.853 100 b 
    loop 17.946 18.4055 19.87737 18.6970 19.1745 65.719 100 c 
1

matrix函數有一個byrow可以與R的再循環行爲一起使用的論點

matrix(5:11,ncol=7,nrow=12,byrow=TRUE)