【发布时间】:2014-01-18 19:36:01
【问题描述】:
我正在尝试将每一行与矩阵中的所有其他行进行比较,以计算每行与所有其他行的差异数。然后将结果存储在矩阵的左下角三角形中。
例如,当行 m[1,] 与行 m[2,] 和 m[3,] 进行比较时,差异计数存储在结果中 mat[c(2:3), 1] 的位置矩阵。
我的问题是我的输入矩阵最多可以有 1e+07 行,并且当前的实现(速度和内存)由于 n^2 比较而无法扩展。建议和帮助将不胜感激。
diffMatrix <- function(x) {
rows <- dim(x)[1] #num of rows
cols <- dim(x)[2] #num of columns
if (rows <= 1) stop("'x' must have atleast two rows")
#potential failure point
mat <- matrix(, rows, rows)
# fill bottom left triangle columns ignoring the diagonal
for (row in 1:(rows-1)) {
rRange <- c((1+row):rows)
m <- matrix(x[row,], nrow=rows-row, ncol=cols, byrow = T)
mat[rRange, row] <- rowSums(m != x[-1:-row, ])
}
return (mat)
}
m <- matrix(sample(1:12, 12, replace=T), ncol=2, byrow=TRUE)
m
# [,1] [,2]
#[1,] 8 1
#[2,] 4 1
#[3,] 8 4
#[4,] 4 5
#[5,] 3 1
#[6,] 2 2
x <- diffMatrix(m)
x
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] NA NA NA NA NA NA
#[2,] 1 NA NA NA NA NA
#[3,] 1 2 NA NA NA NA
#[4,] 2 1 2 NA NA NA
#[5,] 1 1 2 2 NA NA
#[6,] 2 2 2 2 2 NA
m <- matrix(sample(1:5, 50000, replace=T), ncol=10, byrow=TRUE)
# system.time(x <- diffMatrix(m))
# user system elapsed
# 20.39 0.38 21.43
【问题讨论】:
-
你有多少内存?您可能不得不求助于将结果写入磁盘。
-
自定义客户端应用程序是 R 服务器池上的前端并发请求。每个请求都在调用 diffMatrix 需要参与的 R 函数。因此,低内存和超高速至关重要。
-
无论您怎么看,您都必须计算和存储
n^2比较。除非您可以预先计算此矩阵并将其存储以供客户稍后查找,否则您所要求的实际上是不可能的。 -
是的,但是应该有一些方法可以混合 expand.grid 的想法 (stackoverflow.com/questions/19933788/…) 和我的半行循环方法。明天我会试试@alexis_laz 的推荐。
-
您可以根据矩阵包含的数据类型来偷工减料:浮点数、整数、有限范围内的整数、逻辑或其他?稀疏吗?
标签: r loops matrix vectorization