2017-07-12 120 views
2

我使用成像器包的质心,并想出以下功能:快速计算图像(或矩阵)

vector_mc <- function(v) { 
    round(sum(v * 1:length(v))/sum(v)) 
} 

img_mc <- function(img) { 
    w <- width(img) 
    h <- height(img) 

    # sum of all rows 
    # note that as.matrix(img) is a matrix of w rows and h columns. 
    row <- rep(0, w) 
    col <- rep(0, h) 
    for (i in 1:h) { 
    row <- row + as.matrix(img)[, i] 
    col[i] <- sum(as.matrix(img)[, i]) 
    } 

    c(vector_mc(row), vector_mc(col)) 
} 

事实证明,它退出慢。有更好的方法吗?

回答

1

您的主要时间问题在于img_mc的增加/更新。像这样的更新:在R中相对较慢,通常可以写得更快。此外,你继续重铸图像as.matrix和一些时间可能会获得只有这样做一次。

下面是一个更新的功能,有点快:

faster_img_mc <- function(img) { 
    IMG <- as.matrix(img) 
    c(vector_mc(rowSums(IMG)), vector_mc(colSums(IMG))) 
} 

速度增益是好的,大尺寸的影像。对于50×50的图像(已更新的功能被命名在下面的测试f

> microbenchmark::microbenchmark(img_mc(IMG50), f(IMG50)) 
Unit: microseconds 
      expr  min  lq  mean median  uq  max neval cld 
img_mc(IMG50) 425.936 457.4025 2188.54828 518.355 843.2785 146939.579 100 a 
     f(IMG50) 27.475 29.8900 47.69688 33.490 54.0035 247.384 100 a 

对于较大矩阵的增益似乎是围绕一个因素9-10。

+0

谢谢,ekstroem。通过仅删除重复重铸,速度增益非常好,因为我刚测试了100x100图像。只是想知道你是否还优化“rowSums(IMG)”和“colSums(IMG)”?再次感谢。 – bruin

+0

'rowSums'和'colSums'是基本R的一部分,并且是'apply'的更快版本。他们通常很快。 – ekstroem

+0

噢,谢谢...对不起,我不知道那:( – bruin