【问题标题】:How to reverse rows in matrix? [duplicate]如何反转矩阵中的行? [复制]
【发布时间】:2016-04-28 12:12:54
【问题描述】:

我试图从矩阵 m 中颠倒行的顺序,而不是像下面这样:

n <- rbind(m)
n

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15
[4,]   16   17   18   19   20
[5,]   21   22   23   24   25

我想得到这个:

     [,1] [,2] [,3] [,4] [,5]
[5,]   21   22   23   24   25
[4,]   16   17   18   19   20
[3,]   11   12   13   14   15
[2,]    6    7    8    9   10
[1,]    1    2    3    4    5

感谢您的帮助!还在学习基础知识!

【问题讨论】:

  • m[nrow(m):1, ] ?

标签: r matrix


【解决方案1】:

我能想到的反转矩阵m 的行顺序的最简单方法是:

m[nrow(m):1, ]

比较两个选项的一些基准

m <- matrix(rnorm(50000*100), ncol=100)
library(microbenchmark)
microbenchmark(n <- m[nrow(m):1, ], n <- apply(m, 2, rev), unit="relative")

#               expr      min       lq     mean   median       uq      max neval cld
# n <- m[nrow(m):1, ] 1.000000 1.000000 1.000000 1.000000 1.000000 1.000000   100  a 
# n <- apply(m, 2, rev) 2.947735 3.090831 2.878977 3.143367 2.954659 1.816428   100   b

【讨论】:

    【解决方案2】:

    我们可以将apply()rev() 组合到矩阵n 并重新排列条目:

    n <- matrix(1:25, 5, byrow = TRUE)
    apply(n,2,rev)
    #     [,1] [,2] [,3] [,4] [,5]
    #[1,]   21   22   23   24   25
    #[2,]   16   17   18   19   20
    #[3,]   11   12   13   14   15
    #[4,]    6    7    8    9   10
    #[5,]    1    2    3    4    5
    

    通过使用apply() 和等于2 的第二个参数(边距),我们循环遍历n 的所有列,并为每一列应用函数rev(),它反转向量的条目。


    获得相同结果的更紧凑和更快的方法是@Cath指出的解决方案:

    n[nrow(n):1,]
    

    这只是颠倒矩阵中行的顺序。

    【讨论】:

    • 不确定它会比n[nrow(n):1, ]更有效...
    • 谢谢!你能解释一下 apply() 做了什么吗?抱歉,仍在学习基础知识。
    • @Cath 我认为你是对的。您使用n[nrow(n):1,] 的解决方案应该更有效。如果您将其发布为答案,我会投赞成票 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    相关资源
    最近更新 更多