【发布时间】:2018-01-18 12:05:53
【问题描述】:
我正在为ggtern 包进行一些开发,并且我正在尝试生成一个有效的算法来处理三元热图。具体来说,我使用以下帖子 (Ternary Heatmap) 作为起点。
考虑下面的函数,它基于上述链接(部分):
# Produce Points for Triangular Mesh
triMesh = function( n = 1){
n = max(as.integer(n[1]),1)
p = data.frame()
cnt = 0
inc = 1.0/n
stp = seq(0,1,length.out = n + 1 )
for (ix in seq_along(stp)){
z <- stp[ix]
y <- 1 - z
x <- 0
while ( y >= 0 ) {
p <- rbind(p, c(cnt, x, y, z))
y <- y - inc #Step x down
x <- x + inc #Step y up
cnt <- cnt + 1 #Increment Count
}
}
colnames(p) = c("IDPoint","x","y","z")
p = round(p[with(p,order(y,x,-z)),],6)
rownames(p) = 1:nrow(p) - 1
p
}
这是我的版本,在语法上更简洁:
# Produce Points for Triangular Mesh
triMesh2 = function( n = 1 ){
n = as.integer(max(n[1],1))
#Nested plyr calls
result = ldply(0:n,function(y){ ##OUTER
ldply(0:(n-y),function(x){ ##INNER
data.frame(x,y,z = n -x -y) ##DIFF
})
})
result = data.frame( 1:nrow(result)-1,result/n)
names(result) = c('IDPoint','x','y','z')
result
}
现在,使用微基准测试,第一个算法的完成速度提高了几倍:
> microbenchmark(triMesh(10))
Unit: milliseconds
expr min lq mean median uq max neval
triMesh(10) 6.447525 6.91798 8.432698 7.334905 8.727805 23.37242 100
> microbenchmark(triMesh2(10))
Unit: milliseconds
expr min lq mean median uq max neval
triMesh2(10) 27.26659 29.34891 32.50808 31.43524 34.92925 51.8585 100
>
我想知道是否有人可以将第二种算法的性能提高到第一种算法附近(或更好)...
干杯
【问题讨论】:
标签: r optimization plyr microbenchmark