【发布时间】:2021-03-25 04:54:55
【问题描述】:
我有两个大型数值矩阵,需要检查其中一个中的哪些行存在于另一个中(存在等于相等)。这是我的代码:
myMatrix1 <- rbind(c(1,2,3),c(4,5,6),c(7,8,9))
myMatrix2 <- rbind(c(10,11,12),c(4,5,6),c(13,14,15))
logicalMatrix <- apply(myMatrix1,1,checkForEquality)
result <- apply(logicalMatrix,1,any)
checkForEquality <- function(x){
apply(myMatrix2, 1, innerFcn, oneRow = x)
}
innerFcn <- function(x, oneRow){
isTRUE(all.equal(x, oneRow))
}
结果是
[1] FALSE TRUE FALSE
使用两个 2067*198 矩阵,这在我的机器上需要 350 秒。通过 CPU 并行化,我想我可以将它降低到 15 秒左右。不幸的是,任何超过 1 秒的时间都是不可接受的。我需要一些方向。如果重要的话,矩阵只包含 0、1 和 2。
【问题讨论】:
-
在我倾向于用来确定“相同性”的所有基本方法中,
all.equal是最慢的。考虑将all.equal(x,y)替换为all(x==y)。特别是因为您需要返回一个简单的真/假,一旦all.equal发现它们不相等,仍然会在一定程度上进行比较以报告差异。看来您真的想要一个短路操作,而不是“向我报告所有差异”。
标签: r performance matrix