有數據:
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)'或者甚至考慮使用考慮數據大小的稀疏矩陣 –