R 如何滚动展开矩阵

R 如何滚动展开矩阵,r,matrix,scroll,R,Matrix,Scroll,例如,我有一个矩阵: [,1] [,2] [,3] [,4] [1,] 1 2 3 4 [2,] 5 6 7 8 [3,] 9 10 11 12 [4,] 13 14 15 16 我希望它变成 [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [1,] 1 2 3 4 5 6 7 8 [2,] 5 6

例如,我有一个矩阵:

     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
我希望它变成

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    5    6    7    8    9   10   11   12
[3,]    9   10   11   12   13   14   15   16
如何在不使用循环的情况下执行此操作?

1)zoo::rollapply

library(zoo)
rollapply(m, 2, function(x) c(t(x)), by.column = FALSE)
给予:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    5    6    7    8    9   10   11   12
[3,]    9   10   11   12   13   14   15   16
1a)这也可以给出相同的答案:

rollapply(c(t(m)), 8, c, by = 4)
t(sapply(1:3, function(i) t(m)[, i + 0:1]))
2)sapply此备选方案不使用软件包,并给出相同的答案:

rollapply(c(t(m)), 8, c, by = 4)
t(sapply(1:3, function(i) t(m)[, i + 0:1]))
1)动物园::rollapply

library(zoo)
rollapply(m, 2, function(x) c(t(x)), by.column = FALSE)
给予:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    2    3    4    5    6    7    8
[2,]    5    6    7    8    9   10   11   12
[3,]    9   10   11   12   13   14   15   16
1a)这也可以给出相同的答案:

rollapply(c(t(m)), 8, c, by = 4)
t(sapply(1:3, function(i) t(m)[, i + 0:1]))
2)sapply此备选方案不使用软件包,并给出相同的答案:

rollapply(c(t(m)), 8, c, by = 4)
t(sapply(1:3, function(i) t(m)[, i + 0:1]))

在base R中,您可以将行选择与
seq
一起使用:

x <- read.table(text="
1    2    3    4
5    6    7    8
9    10   11   12
13   14   15   16", header=FALSE)

cbind(x[seq(1, nrow(x)-1, by=1),],
      x[seq(2, nrow(x), by=1),])

  V1 V2 V3 V4 V1 V2 V3 V4
1  1  2  3  4  5  6  7  8
2  5  6  7  8  9 10 11 12
3  9 10 11 12 13 14 15 16

x在基本R中,您可以将行选择与
seq
一起使用:

x <- read.table(text="
1    2    3    4
5    6    7    8
9    10   11   12
13   14   15   16", header=FALSE)

cbind(x[seq(1, nrow(x)-1, by=1),],
      x[seq(2, nrow(x), by=1),])

  V1 V2 V3 V4 V1 V2 V3 V4
1  1  2  3  4  5  6  7  8
2  5  6  7  8  9 10 11 12
3  9 10 11 12 13 14 15 16

x代数上,它可以通过乘以以下矩阵来实现

m <- matrix(1:16, 4, 4, byrow=T)
cbind(diag(3), 0, 0, diag(3)) %*% (diag(2) %x% m)

m代数上,它可以通过乘以以下矩阵来实现

m <- matrix(1:16, 4, 4, byrow=T)
cbind(diag(3), 0, 0, diag(3)) %*% (diag(2) %x% m)

m这里的规则是什么<代码>nrows-一次1行
行?你试过什么?@siralen你为什么要删除帖子?它似乎得到了预期的输出这里的规则是什么<代码>nrows-一次1行
行?你试过什么?@siralen你为什么要删除帖子?它似乎得到了预期的产出