Intersecting two matrices
I haven't looked at the size-time relationship, but im2 (below) is faster than your
function on at least one example:
intersectMat <- function(mat1, mat2)
{
#mat1 and mat2 are both deduplicated
nr1 <- nrow(mat1)
nr2 <- nrow(mat2)
mat2[duplicated(rbind(mat1, mat2))[(nr1 + 1):(nr1 + nr2)], , drop=FALSE]
}
im2 <- function(mat1, mat2)
{
stopifnot(ncol(mat1)==2, ncol(mat1)==ncol(mat2))
toChar <- function(twoColMat) paste(sep="\1", twoColMat[,1], twoColMat[,2])
mat1[match(toChar(mat2), toChar(mat1), nomatch=0), , drop=FALSE]
}
m1 <- cbind(1:1e7, rep(1:10, len=1e7)) m2 <- cbind(1:1e7, rep(1:20, len=1e7)) system.time(r1 <- intersectMat(m1,m2))
user system elapsed 430.37 1.96 433.98
system.time(r2 <- im2(m1,m2))
user system elapsed 27.89 0.20 28.13
identical(r1, r2)
[1] TRUE
dim(r1)
[1] 5000000 2 Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com
-----Original Message-----
From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
Of c char
Sent: Monday, July 29, 2013 4:04 PM
To: r-help at r-project.org
Subject: [R] Intersecting two matrices
Dear all,
I am interested to know a faster matrix intersection package for R handles
intersection of two integer matrices with ncol=2. Currently I am using my
homemade code adapted from a previous thread:
intersectMat <- function(mat1, mat2){#mat1 and mat2 are both
deduplicated nr1 <- nrow(mat1) nr2 <- nrow(mat2)
mat2[duplicated(rbind(mat1, mat2))[(nr1 + 1):(nr1 + nr2)], ]}
which handles:
size A= 10578373
size B= 9519807
expected intersecting time= 251.2272
intersecting for corssing MPRs took 409.602 seconds.
scale a little bit worse than linearly but atomic operation is not good.
Wonder if a super fast C/C++ extension exists for this task. Your ideas are
appreciated.
Thanks!
[[alternative HTML version deleted]]
______________________________________________ R-help at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.