在R中通过nrow或ncol移位矩阵

时间:2015-10-30 11:37:08

标签: r image-processing matrix shift

我需要向上/向下或向左/向右移动图像(我已存储为矩阵),我希望它保持在原始矩阵尺寸的范围内。

举一个例子,如果我有一个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

有人可以帮我这个吗?我也希望能够为左/右翻译执行此操作

1 个答案:

答案 0 :(得分:2)

创建了一个处理&#39; left&#39;,&#39; right&#39;,&#39; up&#39;,&#39; down&#39;的功能。

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
 }

检查不同的&#39; n&#39;和方向。

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