我正在寻找R(或Rcpp)中最快的方法,将给定的双精度矩阵(值为0到1之间的值)转换为带有十六进制颜色代码的图像栅格。
目前我正在做的是
library(RColorBrewer)
cols=colorRampPalette(RColorBrewer::brewer.pal(11, "RdYlBu"))(1080)
colfun=colorRamp(RColorBrewer::brewer.pal(11, "RdYlBu"))
mat=matrix(seq(1:1080)/1080,ncol=1920,nrow=1080,byrow=FALSE)
system.time(rastmat <- as.raster(apply(mat, 2, function (col) rgb(colfun(col),max=255)))) # 2.55s
但这对我的应用来说太慢了(我希望能够在0.1秒内完成此操作)。有人会知道如何有效地做到这一点吗?使用颜色函数colfun
或使用cols
作为(哈希?)查找表或类似的东西(在将数据矩阵合并到cols
的长度之后)(以较快者为准) ...
稍后将使用
显示栅格library(grid)
system.time(grid.raster(rastmat,interpolate=FALSE)) # 0.2s
答案 0 :(得分:1)
使用调色板的离散化和预先计算颜色,我可以快10倍地完成任务。考虑到你的代码在我的计算机上运行0.5秒(而不是评论中的2.55秒),我执行你的任务约0.05秒
ncol = 100
colfun = colorRamp(RColorBrewer::brewer.pal(11, "RdYlBu"))
col = rgb(colfun(seq(0,1, length.out = ncol)), max = 255)
val2hexa = function(mat, col)
{
idx = findInterval(mat, seq(0, 1, length.out = length(col)))
colors = col[idx]
rastmat = as.raster(matrix(colors, ncol = ncol(mat), nrow = nrow(mat), byrow = FALSE))
return(rastmat)
}
rastmat <- val2hexa(mat, col)
这里的基准
microbenchmark::microbenchmark(
orig = as.raster(apply(mat, 2, function (col) rgb(colfun(col),max=255))),
new = val2hexa(mat, col),
times = 25)
Unit: milliseconds
expr min lq mean median uq max neval
orig 456.36900 466.7336 516.96512 489.52481 560.94217 618.1538 25
new 49.10714 56.0333 65.29669 57.32988 60.16575 155.7042 25
修改强>
你可以像这样获得几毫秒
val2hexa = function(mat, col)
{
idx = findInterval(mat, seq(0, 1, length.out = length(col)))
colors = col[idx]
dim(colors) <- dim(mat)
rastmat = as.raster(colors)
return(rastmat)
}