gpt4 book ai didi

r - 如何自定义外部函数和矢量化函数?

转载 作者:行者123 更新时间:2023-12-02 01:51:04 28 4
gpt4 key购买 nike

我一个月前问过类似的问题。请参阅 Count the occurrences of unequal numbers from a data frame

我使用 outerVectorize 函数解决了这个问题。我的解决方案如下:

dist_mat<- outer(1:nrow(df),1:nrow(df), 
FUN = Vectorize( function(i,j) sum(df[i,]!=df[j,])))

这很完美,但现在我有一个巨大的矩阵,超出了我的内存大小。

在我得到 dist_mat 之后,我计算每行小于或等于 2 的列数,我现在不能这样做。所以,我想知道我是否可以在外部函数中结合计数操作来避免内存问题。我的结果只会是一个向量。

提前致谢!

最佳答案

虽然这并不能严格回答您的问题,但您应该避免 outer 并使用类似的东西:

tot.rows <- nrow(df)
res <- numeric(tot.rows)
for(i in 1:tot.rows)
for(j in 1:tot.rows)
res[[i]] <- res[[i]] + (sum(df[i,] != df[j,]) <= 2)

outer 将从一开始就预先分配 i * j 矩阵,因此您在使用 outer 时将很难解决问题。如果您的结果确实是一个与数据框长度相同的向量,那么您不需要 outer 生成维度矩阵 nrow(df) * nrow(df) 在您的应用程序中。

上述算法将运行与 outer 相同数量的计算,但为每一行重新使用相同的内存空间,因为您关心的只是最终计数,因此它应该适合内存. 它的速度也应该与外部相当(这是我测试过的玩具示例)。只要您确实需要对每个值进行计算,并且有足够的内存来处理像 outer 那样的完全扩展,向量化操作就很棒,但它们不一定是所有问题的答案。

正如其他人在之前的回答中指出的那样,您可以修改代码,这样您就不会计算矩阵的对角线或三角形之一,因为您的距离计算是对称的,这应该会使计算时间大致减半。

关于r - 如何自定义外部函数和矢量化函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22635920/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com