想象一下,我们正在尝试翻转方形矩阵,而不关心它是否会以行或列方式翻转。我们有几个选择:
flip.by.col <- function(x) x[, rev(seq_len(ncol(x)))]
flip.by.row <- function(x) x[rev(seq_len(nrow(x))), ]
这些矩阵并不相同,但正如我所说,这可以忽略不计。
问题是:从计算角度来看有什么不同吗?
可以想到一个可能的论点:行或列子集是一个低级操作,利用矩阵如何存储在内存中,所以答案是“大概是”。 但是,在使用以下代码进行多次测试后,我找不到任何系统差异:
require(rbenchmark)
N <- 5e3
x <- matrix(rnorm(N^2), N)
benchmark(flip.by.row(x), flip.by.col(x), replications=10)
一般来说,是否会出现问题?
UPD (参见评论中的讨论)
为了澄清,替换一列可能比替换相同长度的一行更快:矩阵由列存储,要替换的元素顺序定位。我不确定它是否可观察到。
答案 0 :(得分:1)
在每种情况下,按行翻转或按列翻转,需要移动相同数量的点:只有中间行/列中的元素(当N
为奇数时)保持固定的位置。所以你无论如何都要做同样的工作。
请注意,使用seq.int
可以提高性能。
flip.by.col2 <- function(x) x[, seq.int(ncol(x), 1)]
flip.by.row2 <- function(x) x[seq.int(nrow(x), 1), ]