2012-02-01 36 views
5

Say 1 của tôi có mat ma trận sau đây, mà là một ma trận chỉ số nhị phân:Matrix với cặp đường chéo của

mat < -matrix (c (1, 1, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1), byrow = T, nrow = 3)

> mat 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 1 1 0 0 0 0 
[2,] 0 0 1 1 0 0 
[3,] 0 0 0 0 1 1 

ma trận này chỉ có 3 hàng. Tôi cần phải tạo một với 10000 hàng, với cùng một mẫu của cặp 1 trên diagonals. Ví dụ: cho 5 hàng, tôi mong đợi ma trận 5 x 10:

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

Có ai biết cách đơn giản để làm điều đó không? Cảm ơn rất nhiều

+0

ví dụ: lấy ma trận nhận dạng và lặp lại mỗi cột – smci

Trả lời

1

Khi bạn không cung cấp đủ yếu tố để điền vào ma trận, chúng được tái chế: nếu bạn cung cấp hai số và n số 0 (hàng đầu tiên và hai phần tử đầu tiên của hàng thứ hai), bạn sẽ nhận được ma trận mong muốn.

n <- 5 
matrix( 
    c(1,1,rep(0,2*n)), 
    byrow=TRUE, nr=n, nc=2*n 
) 
+0

Cảm ơn rất nhiều cho câu trả lời nhanh chóng của bạn. Câu hỏi của tôi không được xác định. Tôi đã chỉnh sửa nó. Best/Fan – user1182757

+0

@ user1182757: Tôi đã chỉnh sửa câu trả lời cho phù hợp với câu hỏi của bạn. –

+0

Tuyệt vời! Cảm ơn rất nhiều :) – user1182757

4

Đây là ma trận thưa thớt, và như vậy, bạn sẽ tham khảo tốt hơn các mục khác 0: điều này sẽ giúp bạn tiết kiệm RAM và giúp tự động tạo ma trận dễ dàng hơn.

Mỗi mục được lập chỉ mục dưới dạng (i, j, x), tham chiếu đến hàng, cột và giá trị. Giả sử bạn có N (nói N = 10) hàng mà bạn muốn điền, sau đó bạn đang tạo 2 mục nhập mỗi hàng (được lập chỉ mục bởi i, trong mã bên dưới); mỗi cột chỉ được sử dụng một lần, do đó, có 2 * N giá trị cột duy nhất. Mỗi-zero phi entry là 1.

Mã cho sản xuất này là:

N = 10 
i = rep(1:N, each = 2) 
j = 1:(2*N) 
v = 1 

library(Matrix) 
mat = sparseMatrix(i = i, j = j, x = v) 

Ma trận kết quả là:

> mat 
10 x 20 sparse Matrix of class "dgCMatrix" 

[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 

Chỉ cần sử dụng đoạn mã trên và thiết lập N = 10000, và bạn sẽ có ma trận của bạn.

Là phần thưởng thêm: ma trận bạn muốn (N = 1E5) chỉ tiêu thụ 321424 byte. Ngược lại, một ma trận dày đặc tiêu chuẩn có kích thước 10K x 20K sẽ mất 1,6 GB, sử dụng các mục số (tức là 8 byte). Như họ đã nói trong "Liên hệ": điều đó có vẻ như một sự lãng phí khủng khiếp của không gian, phải không?

1

Trừ khi bạn định điền vào nhiều giá trị khác trong ma trận, bạn có thể muốn giải pháp ma trận thưa thớt của Iterator. Điều đó nói rằng, đây là một cách dễ dàng để tạo ra một phiên bản không thưa thớt của ma trận:

double_diag <- function(n) 
{ 
    matrix(rep(diag(n), each = 2), byrow = TRUE, nrow = n) 
} 
double_diag(5) 
+0

+1 Thật tuyệt vời! – Tommy

1

@VincentZooneKynd có một giải pháp tốt, nhưng nó đưa ra cảnh báo. Dưới đây là một biến thể tránh được cảnh báo:

n <- 5 
matrix(rep(c(1,1,rep(0,2*n)), len=2*n*n), n, byrow=TRUE) 
0

Trickly:

> n <- 5 
> t(model.matrix(~0+gl(n,2)))[,] 
      1 2 3 4 5 6 7 8 9 10 
gl(n, 2)1 1 1 0 0 0 0 0 0 0 0 
gl(n, 2)2 0 0 1 1 0 0 0 0 0 0 
gl(n, 2)3 0 0 0 0 1 1 0 0 0 0 
gl(n, 2)4 0 0 0 0 0 0 1 1 0 0 
gl(n, 2)5 0 0 0 0 0 0 0 0 1 1 
Các vấn đề liên quan