两个整数矩阵按位置 R 的交集

Intersection of two integer matrices by position R

我想知道一个矩阵的哪些位置与另一个矩阵相交以及哪些值,例如

lab <- as.matrix(read.table(text="[1,]    0    0    0    0    0    0    0    0    0     1
 [2,]    2    0    2    2    2    2    2    2    2     0
 [3,]    2    0    2    0    0    0    0    0    2     2
 [4,]    2    2    2    0    0    0    0    0    2     2
 [5,]    2    0    2    0    0    0    0    0    0     0
 [6,]    2    0    2    0    0    0    0    0    0     0
 [7,]    2    0    2    0    0    0    0    0    0     0
 [8,]    2    0    2    0    0    0    0    3    3     3
 [9,]    2    0    2    0    0    0    0    0    3     3
[10,]    2    0    2    0    0    0    0    0    0     3")[,-1])
str(lab)

la1 <- as.matrix(read.table(text="[1,]    0    1    0    0    0    0    0    0    0     2
 [2,]    3    0    4    4    4    4    4    4    4     0
 [3,]    3    0    4    0    0    0    0    0    4     4
 [4,]    3    0    4    0    5    5    0    0    4     4
 [5,]    3    0    4    0    5    5    0    0    0     0
 [6,]    3    0    4    0    0    0    0    0    0     0
 [7,]    3    0    4    0    0    0    0    0    0     0
 [8,]    3    0    4    0    0    0    0    6    6     6
 [9,]    3    0    4    0    0    0    0    6    6     6
[10,]    3    0    4    0    0    0    0    0    0     6")[,-1])

然后,这些数字代表补丁,la1 的补丁 3 与 la1 的补丁 3 和 4 相交,lab 的补丁 1 与 0(没有其他补丁)相交,补丁 3 lab 的补丁与 la1 的补丁 6 相交。我正在使用以下代码

require(dplyr)
tuples <- tibble()
dx <- dim(lab)[1]
for( i in seq_len(dx))
  for( j in seq_len(dx))
  {
     ii <- tibble(l0=lab[i,j],l1=la1[i,j])
     tuples <- bind_rows(tuples,ii)
  }
tuples %>% distinct()

因为我将使用 3000x3000 的大矩阵,所以我在想是否有更快的方法,可能是使用 rcpp 或光栅来实现。

没有双重 for 循环,我们可以 tmatrix 排列成两列 tibble 并得到 distinct

out <- tibble(l0 = c(t(lab)), l1 = c(t(la1))) %>%
            distinct

-检查 OP 的输出

out_old <- tuples %>% 
              distinct()
all.equal(out, out_old, check.attributes = FALSE)
#[1] TRUE

基准

lab2 <- matrix(sample(0:9, size = 3000 * 3000, replace = TRUE), 3000, 3000)
la2 <- matrix(sample(0:9, size = 3000 * 3000, replace = TRUE), 3000, 3000)
system.time({out2 <- tibble(l0 = c(t(lab2)), l1 = c(t(la2))) %>%
             distinct})
#   user  system elapsed 
#  0.398   0.042   0.440 

如果您只是想加快速度,可以尝试 unique 而不是 data.table,例如,

unique(data.table(c(lab), c(la)))

这是一个基本的 R 解决方案。

as.vector 可能比 c.

unique(cbind(as.vector(lab), as.vector(la1)))
#      [,1] [,2]
# [1,]    0    0
# [2,]    2    3
# [3,]    0    1
# [4,]    2    0
# [5,]    2    4
# [6,]    0    5
# [7,]    3    6
# [8,]    0    6
# [9,]    1    2