2017-03-05 68 views
0

我有一系列光柵圖像的循環,我想提取等於150的值,然後添加整個循環長度的像素總量。使用我只能分別獲得每個圖像的總值的代碼,而不是總的形式。謝謝光柵系列總和

m=52419 #total pixels basin 
    for(i in 1:4){ 
    b1<-raster(myras1[i]) 
    bc = b1 == 150 #Values eq 150 
    nbc = cellStats(bc,stat="sum") 
    print(nbc) 
    [1] 34962 
    [1] 38729 
    [1] 52389 
    [1] 52176 
    pc=nbc*100/m 
    } 

回答

1

一般來說,建議不要在R中使用循環來容易地進行矢量化。我沒有試圖解決你的循環中的(幾個)問題,而是展示了一個更好的方法。可以在一個單一的向量化線執行整個計算:

sum(cellStats(myras1==150, stat="sum")) * 100/m 

斷裂下來:上的光柵堆棧進行cellStats將返回值的矢量,每個層。 sum然後將這些添加到一起。然後我們除以整個堆棧中的單元數(所有層合併)並乘以100以轉換爲一個穿孔。

測試這對一些可重複的僞測試數據:

set.seed(123) 
myras1 = list(
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)), 
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)), 
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)), 
    raster(nrows = 100, ncols = 100, vals = sample(140:150,10000,T)) 
) 
myras1 = stack(myras1) 
m = ncol(myras1) * nrow(myras1) * nlayers(myras1) 

sum(cellStats(myras1==150, stat="sum")) * 100/m 
# [1] 8.815 
+0

它工作正常,但它堅持了太多5000層,有沒有什麼辦法,使其更快?謝謝 – tmsppc

+0

非常大的堆棧計算總是很慢。我不知道你會如何提高速度。也許使用光柵磚而不是堆棧會有所改進。是否無法將其作爲批處理操作運行並在完成後回來?爲了獲得最佳速度,您可以使用FORTRAN而不是R,但是對開發時間的投資可能會花費您更多的時間,而不僅僅是等待R產生結果。或者你可以在雲計算平臺上購買一些多核時間來爲你運行計算。現在雲計算價格合理。 – dww