我有一个简单的矩阵:
mat = rbind(c(1:3),c(4:6),c(7:9))
mat
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 7 8 9
Run Code Online (Sandbox Code Playgroud)
我想现在逐行反转矩阵.那是我想获得的:
revMat
# [,1] [,2] [,3]
# [1,] 3 2 1
# [2,] 6 5 4
# [3,] 9 8 7
Run Code Online (Sandbox Code Playgroud)
为此,我试过了
apply(mat, 1, rev)
Run Code Online (Sandbox Code Playgroud)
结果是:
# [,1] [,2] [,3]
# [1,] 3 6 9
# [2,] 2 5 8
# [3,] 1 4 7
Run Code Online (Sandbox Code Playgroud)
我觉得这很奇怪.这就像行被反转,然后最终矩阵被转置.我不明白为什么.例如,如果我简单地尝试,
apply(mat, 2, rev)
Run Code Online (Sandbox Code Playgroud)
它给了我每列的预期逆转
# [,1] [,2] [,3]
# [1,] 7 8 9
# [2,] 4 5 6
# [3,] 1 2 3
Run Code Online (Sandbox Code Playgroud)
因此,要获得最终结果,我必须执行
t(apply(t(bg), 2, rev))
Run Code Online (Sandbox Code Playgroud)
因此,获得所需的矩阵对我来说不是问题,但我不理解apply/reverse行为中的"异常".任何人都可以向我解释这个吗?
编辑:为了明确区分,我已经知道如何进行逆转.我想知道为什么会这样.如何从许多早期的问题中清楚地看到,包括
apply始终将结果放在第一维中.有关?apply更多信息,请参阅 假设这个输入:
mat <- matrix(1:9, 3, byrow = TRUE)
Run Code Online (Sandbox Code Playgroud)
这里有一些替代方案:
1)转置
t(apply(mat, 1, rev))
Run Code Online (Sandbox Code Playgroud)
2)避免使用索引
mat[, 3:1]
Run Code Online (Sandbox Code Playgroud)
3)iapply 在这里发布了幂等申请:https: //stat.ethz.ch/pipermail/r-help/2006-January/086064.html 使用我们:
iapply(mat, 1, rev)
Run Code Online (Sandbox Code Playgroud)
还有一个幂等的应用,iapply在版本0.8.0的reshape包中(但不是最新版本的reshape):https: //cran.r-project.org/src/contrib/Archive/reshape/
4) rollapply可以使用动物园包中的rollapply:
library(zoo)
rollapply(mat, 1, rev, by.column = FALSE)
Run Code Online (Sandbox Code Playgroud)
5)tapplytapply这里 的表达式返回一个列表,让我们有机会以我们想要的方式将它组合在一起 - 在这种情况下使用rbind:
do.call("rbind", tapply(mat, row(mat), rev))
Run Code Online (Sandbox Code Playgroud)
6)乘以反向对角矩阵 由于rev是线性算子,它可以用矩阵表示:
mat %*% apply(diag(3), 1, rev)
Run Code Online (Sandbox Code Playgroud)
要么
mat %*% (row(mat) + col(mat) == 3+1)
Run Code Online (Sandbox Code Playgroud)