Как вставить нули в seq в R
Мне нужно получить это:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 0 2 0 3 0 4 0 5
[2,] 0 0 0 0 0 0 0 0 0
[3,] 6 0 7 0 8 0 9 0 10
[4,] 0 0 0 0 0 0 0 0 0
[5,] 11 0 12 0 13 0 14 0 15
[6,] 0 0 0 0 0 0 0 0 0
[7,] 16 0 17 0 18 0 19 0 20
[8,] 0 0 0 0 0 0 0 0 0
[9,] 21 0 22 0 23 0 24 0 25
Пишу:
n<-5
x <- c(1,0,2,0,3,0,4,0,5,0,0,0,0,0,0,0,0,0,6,0,7,0,8,0,9,0,10,0,0,0,0,0,0,0,0,0,11,0,12,0,13,0,14,0,15,0,0,0,0,0,0,0,0,0,16,0,17,0,18,0,19,0,20,0,0,0,0,0,0,0,0,0,21,0,22,0,23,0,24,0,25)
x
M<-matrix(x,ncol=n+(n-1),byrow=TRUE)
length(x)
M
Итак, могу ли я получить это с помощью n
? например: x <- 1:n^2
? То есть, я хочу иметь seq(n^2)
в матрице, но мне нужны строки с нулями и столбцами с нулями?
Надеюсь, мой вопрос понятен, большое спасибо:)
Ответы
Ответ 1
Начиная с n
...
tm = matrix(0L, 2*n-1, 2*n-1)
tm[(col(tm) %% 2) & (row(tm) %% 2)] <- seq(n^2)
m = t(tm)
Это не самый быстрый способ, я уверен, но он работает:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 0 2 0 3 0 4 0 5
[2,] 0 0 0 0 0 0 0 0 0
[3,] 6 0 7 0 8 0 9 0 10
[4,] 0 0 0 0 0 0 0 0 0
[5,] 11 0 12 0 13 0 14 0 15
[6,] 0 0 0 0 0 0 0 0 0
[7,] 16 0 17 0 18 0 19 0 20
[8,] 0 0 0 0 0 0 0 0 0
[9,] 21 0 22 0 23 0 24 0 25
В качестве альтернативы, чтобы избежать транспонирования, используйте which
:
m = matrix(0L, 2*n-1, 2*n-1)
w = which((col(m) %% 2) & (row(m) %% 2), arr.ind=TRUE)
m[w[,2:1]] <- seq(n^2)
Ответ 2
Вы можете использовать продукт Kronecker для этого:
n <- 5
m1 <- matrix(seq(n^2), ncol = n, byrow = TRUE)
m2 <- matrix(c(1,0,0,0), ncol = 2)
m3 <- kronecker(m1, m2) # this can also be written as m3 <- m1 %x% m2
m3 <- m3[-nrow(m3),-ncol(m3)]
#> m3
# [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
# [1,] 1 0 2 0 3 0 4 0 5
# [2,] 0 0 0 0 0 0 0 0 0
# [3,] 6 0 7 0 8 0 9 0 10
# [4,] 0 0 0 0 0 0 0 0 0
# [5,] 11 0 12 0 13 0 14 0 15
# [6,] 0 0 0 0 0 0 0 0 0
# [7,] 16 0 17 0 18 0 19 0 20
# [8,] 0 0 0 0 0 0 0 0 0
# [9,] 21 0 22 0 23 0 24 0 25
Ответ 3
Это решение сначала создает вектор x
, как в OP-коде, а затем преобразуется в матрицу:
n <- 5
m <- 2*n - 1
x <- rep_len(c(rep_len(c(1,0), m), rep(0, m)), m^2)
x[x==1] <- 1:n^2
M <- matrix(x, nrow = m, byrow = TRUE)
Ответ 4
Я бы создал разреженную матрицу:
library(Matrix)
n <- 5
inds <- (0:(n -1)) * 2 + 1
inds <- expand.grid(inds, inds)
sparseMatrix(i = inds[[2]],
j = inds[[1]],
x = seq_len(n^2),
dims = rep(2 * n - 1, 2))
#9 x 9 sparse Matrix of class "dgCMatrix"
#
# [1,] 1 . 2 . 3 . 4 . 5
# [2,] . . . . . . . . .
# [3,] 6 . 7 . 8 . 9 . 10
# [4,] . . . . . . . . .
# [5,] 11 . 12 . 13 . 14 . 15
# [6,] . . . . . . . . .
# [7,] 16 . 17 . 18 . 19 . 20
# [8,] . . . . . . . . .
# [9,] 21 . 22 . 23 . 24 . 25
Это может быть преобразовано в плотную матрицу с использованием as.matrix
, если необходимо, но разреженные матрицы дают некоторые преимущества в отношении эффективности.