R中两个矩阵(data.frames)列上的余弦相似性

R中两个矩阵(data.frames)列上的余弦相似性,r,matrix,cosine-similarity,R,Matrix,Cosine Similarity,我有两个矩阵,有相当多的列;通常为1000 x 40000。我需要得到相应行之间的余弦相似性。之前,我使用的是applyM,2,FUN=functionvreturncossimm,V,其中M是一个矩阵,而V是一个向量。我不知道如何直接将向量V转换成矩阵,然后只得到所需的相应列。目前,我使用的是for循环,但效率非常低。我的代码是这样的: for (i in 1:nrow(m1)) { m1$CosSim[i] = cossim(as.numeric(m1[i,1:39998]),

我有两个矩阵,有相当多的列;通常为1000 x 40000。我需要得到相应行之间的余弦相似性。之前,我使用的是applyM,2,FUN=functionvreturncossimm,V,其中M是一个矩阵,而V是一个向量。我不知道如何直接将向量V转换成矩阵,然后只得到所需的相应列。目前,我使用的是for循环,但效率非常低。我的代码是这样的:

for (i in 1:nrow(m1)) {
    m1$CosSim[i] = cossim(as.numeric(m1[i,1:39998]),
        as.numeric(m2[i,1:39998]))
}
请告诉我如何正确使用apply函数族?

尽可能避免使用for循环并应用于矩阵。这会减慢一切。我所知道的这个规则的唯一例外是,如果矩阵的一个维度比另一个维度小得多,那么你的循环正好在更小的维度上

下面的代码直接在矩阵上计算余弦距离。它返回一个长度为nrowxMat的向量,该向量包含第n行向量的余弦作为其第n个元素。当然,nrowxMat=nrowyMat 这是假定的

cosine_dist <- function(xMat, yMat){
     numerator <- rowSums(xMat * yMat)
     denominator <- sqrt(rowSums(xMat^2))*sqrt(rowSums(yMat^2))
     return(numerator / denominator)
}