【发布时间】:2016-03-14 04:02:24
【问题描述】:
我正在尝试创建一个自定义分布函数(基于 hasrsine)。现在我的原型是一个双 for 循环。我环顾了矢量化操作,我仍然在学习很多东西(对 R 来说很新),所以不清楚如何清理它。最后,我想要一个 NxN 矩阵来比较地球上各点之间的距离。这是我现在的测试数据:
coord
Latitude Longitude
1 16.34577 6.303545
2 12.49475 28.626396
3 27.79462 60.032495
4 44.42699 110.114216
5 -69.85409 87.946878
邪恶的替身for-loop:
for (i in 1:dim(coord)[1]){
for(j in 1:dim(coord)[1]) # for each column {
mymat[i,j] = coord[i,1]*coord[j,2] # custom function for future
}
}
结果:
X1 X2 X3 X4 X5
1 103.03629 467.9204 981.2773 1799.902 1437.559
2 78.76122 357.6796 750.0910 1375.850 1098.874
3 175.20461 795.6596 1668.5801 3060.582 2444.450
4 280.04755 1271.7847 2667.0632 4892.043 3907.215
5 -440.32840 -1999.6708 -4193.5152 -7691.928 -6143.449
当然,对于 5 个样本,没问题。但我有一个 100k 的列表。
我确实在搜索后看到了一个函数
custom.dist <- function(x, my.dist) {
mat <- sapply(x, function(x.1) sapply(x, function(x.2) my.dist(x.1, x.2)))
as.dist(mat)
}
但我不明白发生了什么并且无法让它工作,即使使用像 x*y 这样的虚拟函数
【问题讨论】:
-
请记住,您还可以使用
Rcpp- stackoverflow.com/questions/29054459/… -
这只是第一列和第二列的外积?即
cbind(coord[,1]) %*% rbind(coord[,2])? -
outer(coord[,1], coord[,2],"*") -
@Khashaa 刚刚偷看了
outer的源代码,当使用"*"时,直接跳到coord[ , 1] %*% t(coord[ , 2])会更快 -
或者你真的想在你的循环中间定义一个不同的函数吗?如果是这样,您应该真正指定
my.dist的确切含义
标签: r performance for-loop vectorization