Как вставить нули в 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, если необходимо, но разреженные матрицы дают некоторые преимущества в отношении эффективности.