R:使用给定颜色查找表将矩阵转换为颜色栅格的最快方法

时间:2018-01-06 03:52:40

标签: r graphics colors rcpp raster

我正在寻找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

1 个答案:

答案 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)
}