将两个矩阵中的重叠相加

时间:2016-10-31 10:34:54

标签: r matrix cross-product

我正在尝试计算科学论文之间的邻近度量。当论文A的两位作者居住在阿姆斯特丹,1位居住在纽约,而论文B的三位作者居住在阿姆斯特丹,我希望结果为3 + 2 = 5。我有两个大矩阵,其中列代表论文,行代表城市。例如:

矩阵matrixA:

                       A1      A2

美国加利福尼亚州戴维斯4。
美国加利福尼亚州洛杉矶。 1
PALO ALTO,CA USA。 1
美国加利福尼亚州萨克拉门托2。
美国加利福尼亚州圣塔莫尼卡。 2

和MatrixB:

                         B1

美国加利福尼亚州戴维斯1 美国加利福尼亚州洛杉矶2 PALO ALTO,CA USA。
美国加利福尼亚州萨克拉门托1 美国加利福尼亚州圣塔莫尼卡2日

两者的交叉产物(MatrixA%*%t(MatrixB))接近我想要的。对于A2-B1,这给了我,

(0 * 1)+(1 * 2)+(1 * 0)+(0 * 1)+(2 * 2)= 6

但我想要的是:

(0 * 1)+(1 + 2)+(1 * 0)+(0 * 1)+(2 + 2)= 7

当一个为0时再乘以,否则加。有没有一种有效的(!)方法来实现这一点,使用R?

1 个答案:

答案 0 :(得分:0)

您要做的就是先用0替换AB矩阵中的NA,然后添加他们用colSums na.rm=TRUEA[A==0] <- NA B[B==0] <- NA ## I'm assuming that you want to compare B to all columns of A C <- colSums(A + rep(B,ncol(A)), na.rm=TRUE) ## A1 A2 ## 8 7

A <- structure(c(4, 0, 0, 2, 0, 0, 1, 1, 0, 2), .Dim = c(5L, 
2L), .Dimnames = list(NULL, c("A1", "A2")))
##     A1 A2
##[1,]  4  0
##[2,]  0  1
##[3,]  0  1
##[4,]  2  0
##[5,]  0  2

B <- structure(c(1, 2, 0, 1, 2), .Dim = c(5L, 1L), .Dimnames = list(
    NULL, "B1"))
##     B1
##[1,]  1
##[2,]  2
##[3,]  0
##[4,]  1
##[5,]  2

数据:

int b = foo(1); // returns 0x1
int c = foo(2); // returns 0x2