2017-03-05 91 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