2017-07-12 121 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