繁体   English   中英

高效R栅格代数

[英]Efficient R Raster algebra

为了计算使用线性扫描仪获取的多光谱辐射图像的反射率,我有一个白色参考值的1行数组:多光谱图像A:x行,y cols,z波段多光谱参考图像B :1行,y列,z波段

在简单的数组形式的R代码中,我们可以设置以下示例:

a <- array(runif(3*5*6),dim=c(3,5,6)) 
b <- matrix(runif(5*6),nrow=5)

在此示例中,我将重复b的每一行以将数组制作为a,然后计算a / b,为此:

b2 <- rep(b,nrow(a))
dim(b2) <- c(ncol(a),dim(a)[3],nrow(a))
b3 <- aperm(b2,c(3,1,2))
res <- a/b3

或使用循环:

res <- a
for(i in 1:nrow(a)){
  res[i,,] <- a[i,,]/b
}

现在,实际图像相对较大,x = 969,y = 640,z = 224,并且想知道是否有使用包栅格进行此操作的相对有效的方法。 我试过的很慢:

* a和b从envi文件中读取为光栅块
*我如上所述计算b3
*我将b3转换为光栅块,但是它非常慢并且接近内存问题:

x=969; y=640; z=224
b <- matrix(runif(y*z),nrow=y)
b2 <- rep(b,x)
dim(b2) <- c(y,z,x)
b3 <- aperm(b2,c(3,1,2))
b4 <- brick(b3)
extent(b4) <- c(0,y,0,x)
b4
writeRaster(b4,"b4",overwrite=TRUE)
rm(b2,b3,b4)
b4 <- brick("b4.gri")
b4
res <- overlay(x=RadIma,y=b4,fun=function(x,y){x/y}, filename="res",overwrite=TRUE)

可能有一种直接与b运算的方式,从而避免了b2,b3和b4 ...

我已经尝试过merge(),但是虽然它适用于可重现的示例,但在实际情况下实在是太慢了:

a <- array(runif(3*5*6),dim=c(3,5,6)) 
b <- matrix(runif(5*6),nrow=5)
dim(b) <- c(1,dim(a)[2:3])

a <- brick(a)
extent(a) <- c(0,ncol(a),0,nrow(a))
res(a) <- 1
b <- brick(b)
extent(b) <- c(0,dim(b)[2],0,1)
res(b) <- 1
a
b

v <- vector(length=nrow(a),mode="list")
v[1:nrow(a)] <- list(b)
for(i in 1:nrow(a)) extent(v[[i]]) <- c(0,ncol(a),i-1,i)
b4 <- do.call(merge,args=c(v,filename="b4",format="GTiff",overwrite=TRUE))
b4
dim(a)
dim(b4)
res <- overlay(x=a,y=b4,fun=function(x,y){x/y}, filename="res",overwrite=TRUE)

因此,这实际上不是解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM