当前位置 : 主页 > 手机开发 > 无线 >

创建每行移动一列的矩阵

来源:互联网 收集:自由互联 发布时间:2021-06-10
有没有一种有效的方法可以从顶部或底部开始每行将矩阵移动一列? 例如,请考虑以下矩阵: [,1] [,2] [,3] [,4] [,5][1,] 1 4 7 10 13[2,] 2 5 8 11 14[3,] 3 6 9 12 15 如果从下往上移动,它应该如下所示
有没有一种有效的方法可以从顶部或底部开始每行将矩阵移动一列?

例如,请考虑以下矩阵:

[,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15

如果从下往上移动,它应该如下所示:

[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]   NA   NA    1    4    7   10   13
[2,]   NA    2    5    8   11   14   NA
[3,]    3    6    9   12   15   NA   NA

如果从顶部向下移动,它应该如下所示:

[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    1    4    7   10   13   NA   NA
[2,]   NA    2    5    8   11   14   NA
[3,]   NA   NA    3    6    9   12   15

这是我用for循环做的方法,但我想知道是否有更简单的方法:

oldNumCols <- ncol(matrix.data)
newNumCols <- sum(dim(matrix.data))-1
shiftedData <- matrix(NA, nrow = nrow(matrix.data), ncol = newNumCols)
for(i in 1:nrow(matrix.data))
{
  #posToReplace <- newNumCols - oldNumCols + 1:oldNumCols - i + 1 # shifting from the bottom up
  posToReplace <- 1:oldNumCols + i - 1 # shifting from the top down
  shiftedData[i,] <- replace(shiftedData[i,], posToReplace, matrix.data[i,])
}
您可以尝试一些花哨的矩阵索引来放置值.例如,这是一个可以提供帮助的功能

rowslide <- function(x, bottomup=FALSE) {
    m <- matrix(NA, nrow=nrow(x), ncol=ncol(x)+nrow(x)-1)
    a <- -1
    b <- nrow(x)
    if(bottomup) {
        a <- 1
        b <- -1
    }
    idx<-cbind(
        rep(1:nrow(x), each=ncol(x)),
        a*rep(1:nrow(x), each=ncol(x))+1:ncol(x)+b
    )
    m[idx]<-t(x)
    m
}

我们用它来测试它

x<-matrix(1:15, nrow=3)

rowslide(x)
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]    1    4    7   10   13   NA   NA
# [2,]   NA    2    5    8   11   14   NA
# [3,]   NA   NA    3    6    9   12   15

rowslide(x, TRUE)
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7]
# [1,]   NA   NA    1    4    7   10   13
# [2,]   NA    2    5    8   11   14   NA
# [3,]    3    6    9   12   15   NA   NA
网友评论