快速矩阵子集通过'[':按行,按列或无关紧要?

时间:2013-11-21 12:50:08

标签: r matrix subset

想象一下,我们正在尝试翻转方形矩阵,而不关心它是否会以行或列方式翻转。我们有几个选择:

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 (参见评论中的讨论)

为了澄清,替换一列可能比替换相同长度的一行更快:矩阵由列存储,要替换的元素顺序定位。我不确定它是否可观察到。

1 个答案:

答案 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), ]