有数据:
set.seed(991)
M1 = matrix(sample(5, 50, TRUE), 5)
M2 = matrix(sample(5, 25, TRUE), 5)
您的解决方案回报:
op = sapply(1:ncol(M2),
function(k) apply(M1, 2, function(x) length(intersect(M2[, k], x))))
op
# [,1] [,2] [,3] [,4] [,5]
# [1,] 3 1 3 2 3
# [2,] 3 2 3 3 4
# [3,] 2 2 2 2 3
# [4,] 2 3 3 2 3
# [5,] 2 2 3 1 2
# [6,] 2 2 2 2 3
# [7,] 2 3 3 2 3
# [8,] 2 2 3 3 3
# [9,] 2 2 3 3 3
#[10,] 1 3 2 1 2
这就是
ans1 = tcrossprod(table(col(M1), M1) > 0L, table(col(M2), M2) > 0L)
回报。
all.equal(op, ans1, check.attributes = FALSE)
#[1] TRUE
因为我们不需要出现次数的数量,我们可以用简单的矩阵运算代替昂贵的呼叫table
:
m1 = matrix(0L, ncol(M1), max(M1))
m1[cbind(rep(1:ncol(M1), each = nrow(M1)), c(M1))] = 1L
m2 = matrix(0L, ncol(M2), max(M2))
m2[cbind(rep(1:ncol(M2), each = nrow(M2)), c(M2))] = 1L
ans2 = tcrossprod(m1, m2)
all.equal(op, ans2)
#[1] TRUE
对于你的情况,似乎更适合通过使启动稀疏的表格,如果有机会的话,以避免内存约束上:
library(Matrix)
sm1 = sparseMatrix(x = 1L,
i = rep(1:ncol(M1), each = nrow(M1)),
j = M1,
use.last.ij = TRUE)
sm2 = sparseMatrix(x = 1L,
i = rep(1:ncol(M2), each = nrow(M2)),
j = M2,
use.last.ij = TRUE)
ans3 = tcrossprod(sm1, sm2)
all.equal(op, as.matrix(ans3), check.attributes = FALSE)
#[1] TRUE
看来'tcrossprod(表(COL(M1),M1)> 0L,表(COL(M2),M2)> 0L)'是类似于你在做什么。因为你不关心出现的次数,可以用更有效的替换(矩阵(0L,ncol(M1),max(M1)),cbind替换table(col(M1),M1)> 0L' (rep(1:ncol(M1),each = nrow(M1)),c(M1)),1L)'或者甚至考虑使用考虑数据大小的稀疏矩阵 –