【问题标题】:Find angle between every row of a raster and matrix (or two matrices) in R在R中查找栅格和矩阵(或两个矩阵)的每一行之间的角度
【发布时间】:2020-07-17 05:49:02
【问题描述】:

我有一个包含三个波段的栅格和一个包含三个列的矩阵。

library(raster)
#Make two single band raster with random values
r1 <- raster(ncol=36, nrow=18, xmn=-1000, xmx=1000, ymn=-100, ymx=900)
set.seed(42)
values(r1) <- runif(ncell(r1))
r2 <- raster(ncol=36, nrow=18, xmn=-1000, xmx=1000, ymn=-100, ymx=900)
set.seed(123)
values(r2) <- runif(ncell(r2))
r3 <- raster(ncol=36, nrow=18, xmn=-1000, xmx=1000, ymn=-100, ymx=900)
set.seed(543)
values(r3) <- runif(ncell(r3))
#Stack them into a three-band raster
r <- stack(r1, r2, r3)

#Make a matrix with values    
y <- matrix(ncol=3, nrow=2, seq(1,6,1))

我想找出 y 的每一行和 r 的每个单元格之间的角度。

#Function for angle
    specAngle <- function(a,b){
        acos(sum(a*b)/( sqrt(sum(a*a))*sqrt(sum(b*b))))
    }

我可以通过以下方式将栅格转换为矩阵:

m <- getValues(r)

现在每个矩阵都具有相同的形状(每个矩阵 3 列,每行作为一个像素或来自 y 的样本)。我看过使用嵌套的 apply() 函数,但老实说,我不理解语法,因此无法让它工作。

我有 40 多个非常大的高光谱栅格(425 个波段)和一个 50 行矩阵,我需要使用它来生成 40 多个新栅格,每个栅格有 50 个波段。我怎样才能有效地做到这一点?

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    我认为你可以这样做

    x <- lapply(1:nrow(y), function(rownr) calc(r, function(i) specAngle(i, y[rownr,])))
    s <- stack(x)
    

    或者写成循环

    x <- list()
    for (i in 1:nrow(y)) {
        x[[i]] <- calc(r, function(j) specAngle(j, y[i,]))
    }  
    s <- stack(x)
    

    您还可以重写 specAngle 以便它可以一次计算所有行(并返回一个向量)并且您不需要循环/lapply

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多