在 R 中按 nrow 或 ncol 移动矩阵

Shifting matrix by nrow or ncol in R

我需要移动图像(我已将其存储为矩阵)up/down 或 left/right,我希望它保持在原始矩阵尺寸的范围内。

举个例子,如果我有一个 3x3 矩阵

x <- matrix(seq(1,9),3,3)

          [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    2    5    8
    [3,]    3    6    9

我想把它调低一个我会得到

          [,1] [,2] [,3]
    [1,]    NA   NA   NA
    [1,]    1    4    7
    [2,]    2    5    8

有人可以帮我解决这个问题吗?我也希望能够在 left/right

中对翻译执行此操作

创建了一个函数来处理 'left'、'right'、'up'、'down'。

f1 <- function(mat, dir, n=1){
 if(dir %in% c('up', 'down')){
  stopifnot(nrow(mat)> n)
  i1 <- rep(NA, ncol(mat))
 if(dir=='down'){
    r1 <- `dimnames<-`(do.call(rbind, c(replicate(n, i1, simplify=FALSE), 
                                list(head(mat, -n)))), NULL)
   }

 else {

   r1 <- `dimnames<-`(do.call(rbind, c(list(tail(mat, -n)),
                         replicate(n, i1, simplify=FALSE))), NULL)

  }
  }
 else {
   stopifnot(ncol(mat) > n)
   i2 <- rep(NA, nrow(mat))
   if(dir=='right'){
     r1 <- `dimnames<-`(do.call(cbind, c(replicate(n, i2, simplify=FALSE),
                           list(mat[, head(1:ncol(mat),-n)]))), NULL)
    }
   else {
    r1 <- `dimnames<-`(do.call(cbind, c(list(mat[,tail(1:ncol(mat), -n)]), 
                      replicate(n, i2, simplify=FALSE))), NULL)
   }

 }
   r1
 }

检查不同的 'n' 和方向。

f1(x, 'up', 2)
#     [,1] [,2] [,3]
#[1,]    3    6    9
#[2,]   NA   NA   NA
#[3,]   NA   NA   NA

f1(x, 'down',2)
#     [,1] [,2] [,3]
#[1,]   NA   NA   NA
#[2,]   NA   NA   NA
#[3,]    1    4    7
 f1(x, 'left',1)
#     [,1] [,2] [,3]
#[1,]    4    7   NA
#[2,]    5    8   NA
#[3,]    6    9   NA
 f1(x, 'right',1)
#     [,1] [,2] [,3]
#[1,]   NA    1    4
#[2,]   NA    2    5
#[3,]   NA    3    6

f1(x, 'right',3)
#Error: ncol(mat) > n is not TRUE

f1(x, 'up',3)
#Error: nrow(mat) > n is not TRUE