在 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
我需要移动图像(我已将其存储为矩阵)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