갖는 데이터 :
set.seed(991)
M1 = matrix(sample(5, 50, TRUE), 5)
M2 = matrix(sample(5, 25, TRUE), 5)
솔루션의 반환 : 어떤
ans1 = tcrossprod(table(col(M1), M1) > 0L, table(col(M2), M2) > 0L)
반환
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
이다.우리가 발행 수의 수를 필요로하지 않기 때문에
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)는 '인 당신이하고있는 것과 비슷합니다. 'table (col (M1), M1)> 0L'은보다 효율적인'replace (행렬 (0L, ncol (M1), max (M1)), cbind (rep (1 : ncol (M1), each = nrow (M1)), c (M1)), 1L)'또는 데이터의 크기를 고려한 희소 행렬 사용을 고려하십시오. –