2013-02-13 37 views
5

Tôi có một vector nói vec = c(1,1) và tôi muốn nhân rộng nó (cbind) cột khôn ngoan 10 lần vì vậy tôi có thể nhận được một cái gì đó trông giống như matrix(1, 10, 2). Có chức năng nào hoạt động trên vec có thể thực hiện sao chép này không? tức là đại diện (vec, 10)?Nhân bản véc tơ trong R

Cảm ơn!

Trả lời

8
vec <- c(1,2) 
rep(1,10) %*% t.default(vec) 
     [,1] [,2] 
[1,] 1 2 
[2,] 1 2 
[3,] 1 2 
[4,] 1 2 
[5,] 1 2 
[6,] 1 2 
[7,] 1 2 
[8,] 1 2 
[9,] 1 2 
[10,] 1 2 

Hoặc như @Joshua chỉ ra:

tcrossprod(rep(1,10),vec) 

Một số tiêu chuẩn:

library(microbenchmark) 

microbenchmark(rep(1,10) %*% t.default(vec), 
       matrix(rep(vec, each=10), ncol=2), 
       t.default(replicate(10, vec)), 
       tcrossprod(rep(1,10),vec),times=1e5) 

Unit: microseconds 
            expr min  lq median  uq  max 
1 matrix(rep(vec, each = 10), ncol = 2) 2.819 3.699 4.3970 5.3700 2132.240 
2   rep(1, 10) %*% t.default(vec) 2.456 3.185 3.6750 5.5370 2121.746 
3   t.default(replicate(10, vec)) 57.741 62.987 64.3740 65.9590 26654.678 
4   tcrossprod(rep(1, 10), vec) 2.192 2.924 3.3745 5.2465 2145.709 
+1

Bạn cũng có thể sử dụng 'tcrossprod'. –

+0

@shujaa Chúng tôi đã cố gắng để có được một cái gì đó như 'ma trận (1, 10, 2)', đó là những gì OP tuyên bố muốn. – Roland

2

gì về:

R> vec = c(1,2) 
R> matrix(rep(vec, each=10), ncol=2) 
     [,1] [,2] 
 [1,]    1    2 
 [2,]    1    2 
 [3,]    1    2 
 [4,]    1    2 
.... 
5

Một lựa chọn là:

vec <- c(1,1) 
t(replicate(10, vec)) 

> t(replicate(10, vec)) 
     [,1] [,2] 
[1,] 1 1 
[2,] 1 1 
[3,] 1 1 
[4,] 1 1 
[5,] 1 1 
[6,] 1 1 
[7,] 1 1 
[8,] 1 1 
[9,] 1 1 
[10,] 1 1 
+1

Một vòng lặp trong ngụy trang ... – Roland

+0

Không có gì sai với vấn đề này nhỏ. –

Các vấn đề liên quan