我在R中有一个矩阵,如下所示:
|1|2|3|
|1|2|3|
|1|2|3|
有没有一种简单的方法将整个矩阵顺时针旋转90度以获得这些结果?
|1|1|1|
|2|2|2|
|3|3|3|
再次旋转90度:
|3|2|1|
|3|2|1|
|3|2|1|
?
t
不会旋转条目,它是沿着对角线翻转:
x <- matrix(1:9, 3)
x
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
t(x)
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
## [3,] 7 8 9
R矩阵顺时针旋转90度:
在转置之前,您还需要颠倒列:
rotate <- function(x) t(apply(x, 2, rev))
rotate(x)
## [,1] [,2] [,3]
## [1,] 3 2 1
## [2,] 6 5 4
## [3,] 9 8 7
rotate(rotate(x))
## [,1] [,2] [,3]
## [1,] 9 6 3
## [2,] 8 5 2
## [3,] 7 4 1
rotate(rotate(rotate(x)))
## [,1] [,2] [,3]
## [1,] 7 8 9
## [2,] 4 5 6
## [3,] 1 2 3
rotate(rotate(rotate(rotate(x))))
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
R矩阵逆时针旋转90度:
在进行反转之前先进行转置,相当于逆时针旋转:
foo = matrix(1:9, 3)
foo
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
foo <- apply(t(foo),2,rev)
foo
## [,1] [,2] [,3]
## [1,] 7 8 9
## [2,] 4 5 6
## [3,] 1 2 3
rotate = function(mat) t(mat[nrow(mat):1,,drop=FALSE])
- baptisteapply(t(x), 2, rev)
。 - Matthew Lundbergapply(x, 1, rev)
,但我不理解一个重新排序的函数如何可能改变矩阵的维度(尽管在这种情况下没有改变)?!如果你不知道我会发布一个问题。 - geotheorym <- matrix(rep(1:3,each=3),3)
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 2 3
[3,] 1 2 3
t(m[nrow(m):1,])
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 2 2 2
[3,] 3 3 3
m[nrow(m):1,ncol(m):1]
[,1] [,2] [,3]
[1,] 3 2 1
[2,] 3 2 1
[3,] 3 2 1
t(m)[ncol(m):1,]
[,1] [,2] [,3]
[1,] 3 3 3
[2,] 2 2 2
[3,] 1 1 1
旋转矩阵180°的简单方法如下:
m <- matrix(1:8,ncol=4)
# [,1] [,2] [,3] [,4]
# [1,] 1 3 5 7
# [2,] 2 4 6 8
rot <- function(x) "[<-"(x, , rev(x))
rot(m)
# [,1] [,2] [,3] [,4]
# [1,] 8 6 4 2
# [2,] 7 5 3 1
rot(rot(m))
# [,1] [,2] [,3] [,4]
# [1,] 1 3 5 7
# [2,] 2 4 6 8
Matrix
类,它可以保持稀疏性。然而,你的代码在R 3.2.1中不起作用了吗?它抱怨缺少value
参数。相反,这个变化可以工作:rotate <- function(x) {x[] <- rev(x); x}
。 - Ken Williams"[<-"
这部分的含义? - pogibas[<-
用于索引替换。在代码x[i] <- y
中,对象x
将被更改。如果您使用"[<-"(x, i, y)
,则修改后的对象将被返回,而x
不会被更改。 - Sven Hohenstein#first reverse, then transpose, it's the same as rotate 90 degrees
rotate_clockwise <- function(x) { t( apply(x, 2, rev))}
#first transpose, then reverse, it's the same as rotate -90 degrees:
rotate_counter_clockwise <- function(x) { apply( t(x),2, rev)}
#or if you want a library to help make things easier to read:
#install.packages("pracma")
library(pracma)
rotate_one_eighty <- function(x) { rot90(x, 2) }
rotate_two_seventy <- function(x) { rot90(x, -1) }
foo = matrix(1:9, 3)
foo
foo = rotate_clockwise(foo)
foo
foo = rotate_counter_clockwise(foo)
foo
foo = rotate_one_eighty(foo)
foo
输出:
[,1] [,2] [,3]
[1,] 1 4 7 #original matrix
[2,] 2 5 8
[3,] 3 6 9
[,1] [,2] [,3]
[1,] 3 2 1
[2,] 6 5 4 #rotated 90 degrees
[3,] 9 8 7
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8 #rotated -90 degrees
[3,] 3 6 9
[,1] [,2] [,3]
[1,] 9 6 3
[2,] 8 5 2 #rotated 180 degrees
[3,] 7 4 1
注意,将矩阵顺时针旋转,然后逆时针旋转会将数字返回到原始位置,而旋转180度就像旋转90度两次。
或者根据Eric Leschinski的方法将它们合并到一个函数中:
rotate <- function(x, clockwise=T) {
if (clockwise) { t( apply(x, 2, rev))
} else {apply( t(x),2, rev)}
}
t
能够360度工作吗?还是只能向右90度? - Johannes