2012-02-01 2 views
5

сказать, что я следующая матрица мат, который является двухкомпонентным матричный индикатор:матрица с диагональными парами 1 по

мат < -матрица (с (1, 1, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1), byrow = Т, 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 

Эта матрица имеет только три строки. Мне нужно создать один из 10000 строк с одинаковой парой пар на диагоналях. . для 5 строк, я ожидаю, что матрица 5 × 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 

Кто-нибудь знает простой способ сделать это? Большое спасибо

+0

т.е. взять единичную матрицу и дублировать каждый столбец – smci

ответ

1

Если вы не представите достаточное количество элементов для заполнения матрицы, они будут переработаны: если вы предоставите два и n нулей (первая строка и первые два элемента второй строки), вы получите искомая матрица.

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

Спасибо большого за быстрый ответ. Мой вопрос был не определен. Я отредактировал его. Best/Fan – user1182757

+0

@ user1182757: Я отредактировал свой ответ, чтобы ответить на ваш вопрос. –

+0

Ницца! Спасибо большое :) – user1182757

4

Это разреженная матрица, и, таким образом, вы будете делать гораздо лучше, ссылаясь на ненулевые элементы: это сэкономит вам RAM и сделать его проще для автоматического создания матрицы.

Каждая запись индексируется как (i, j, x), ссылаясь на строку, столбец и значение. Предположим, что у вас есть N (например, N = 10) строк, которые вы хотите заполнить, тогда вы производите 2 записи в строке (индексируется i, в коде ниже); каждый столбец используется только один раз, поэтому есть уникальные значения столбцов 2 * N. Каждый ненулевой элемент равен 1.

Код для изготовления это:

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

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

Полученная матрица:

> 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 

Просто используйте код выше и установить N = 10000, и у вас будет ваша матрица.

В качестве дополнительного бонуса: желаемая матрица (N = 1E5) потребляет всего 321424 байта. Напротив, стандартная плотная матрица размером 10K x 20K будет занимать 1,6 ГБ, используя цифровые (например, 8-байтовые) записи. Как они сказали в «Контакт»: это похоже на ужасную трату пространства, верно?

1

Если вы не намерены заполнять многие другие значения в матрице, вам, вероятно, понадобится разреженное матричное решение Iterator. Тем не менее, вот милый способ генерации неразреженной версии матрицы:

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

+1 Действительно хороший! – Tommy

1

@VincentZooneKynd имеет красивое решение, но это дает предупреждение. Вот вариант, который позволяет избежать предупреждения:

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