我想通过使用余弦定律对距离矩阵计算进行矢量化处理。对于没有缺失值的矩阵,对于非常大的矩阵,此计算甚至比dist
更快。
该函数如下所示:
vectorizedDistMat <- function(x,y) {
an = rowSums(x^2)
bn = rowSums(y^2)
m = nrow(x)
n = nrow(y)
tmp = matrix(rep(an, n), nrow=m)
tmp = tmp + matrix(rep(bn, m), nrow=m, byrow=TRUE)
sqrt( abs(tmp - 2 * tcrossprod(x,y) ))
}
现在,当两个矩阵相乘时,缺失值会使事情复杂化,尤其是在上述函数的最后一行中。有一种方法可以追溯性地计算缺失值,例如here。但是,当矩阵相乘时,如何有效地防止缺失值“相乘”?
例如,请参见下面的M1
和M2
:
set.seed(42)
M1 = matrix(rnorm(50), nrow = 10, ncol = 5)
M2 = matrix(rnorm(50), nrow = 10, ncol = 5)
M1[1,2] = NA
M2[3,4] = NA
此处,tcrossprod(M1, M2)
在第一行和第三列中产生NA。我该如何处理它们并提前摆脱它们(例如内置函数dist
)?