簡體   English   中英

R; 用 apply() function 替換嵌套的 for 循環

[英]R; replace nested for loop with apply() function

我正在研究矩陣中的數據替換。 替換的數據將通過計算以值為中心的 (1+2k)X(1+2k) 矩陣的 sd 來計算。

replace.loop = function(n, m, k, pad){
  #search the value row by row, column by column 
  for (i in n) {
    for (j in m) {
      pad[i,j] = sd(as.vector(pad[(i-k):(i+k),(j-k):(j+k)]))
    }
  }
  return(pad) #return the matrix that finishing calculation
}

有沒有辦法用任何 apply() function 重寫這個 function? 我是 R 初學者,所以我不確定我應該使用哪個 apply() function。

例如:

X = matrix(c(.5,.5,.4,.4,.3,.5,.5,.4,.3,.3,.4,.4,.3,.2,.2,.4,.4,.3,.2,.1,.3,.3,.2,.2,.1), ncol=5)
k = 1
pad.X = matrix(0, dim(X)[1]+2*k, dim(X)[2]+2*k)
n = (k+1):(dim(X)[1]+k);  m = (k+1):(dim(X)[2]+k)
pad.X[n, m] = X

謝謝!

我創建了一個名為padOutpad副本。 mapply會將結果作為矩陣返回,然后您可以使用矩陣索引將其分配給padOut的相關部分:

replace.apply = function(n, m, k, pad){
  kk <- -k:k
  idx <- expand.grid(n, m)
  padOut <- pad
  padOut[as.matrix(idx)] <- mapply(function(i) sd(pad[idx[i,1] + kk, idx[i, 2] + kk]), 1:(length(m)*length(n)))
  return(padOut)
}

使用您的示例數據:

X = matrix(c(.5,.5,.4,.4,.3,.5,.5,.4,.3,.3,.4,.4,.3,.2,.2,.4,.4,.3,.2,.1,.3,.3,.2,.2,.1), ncol=5)
k = 1
pad.X = matrix(0, dim(X)[1]+2*k, dim(X)[2]+2*k)
n = (k+1):(dim(X)[1]+k);  m = (k+1):(dim(X)[2]+k)
pad.X[n, m] = X

replace.loop = function(n, m, k, pad){
  #search the value row by row, column by column
  padOut <- pad
  
  for (i in n) {
    for (j in m) {
      padOut[i,j] = sd(as.vector(pad[(i-k):(i+k),(j-k):(j+k)]))
    }
  }
  return(padOut) #return the matrix that finishing calculation
}

pad1 <- replace.loop(n, m, k, pad.X)
pad2 <- replace.apply(n, m, k, pad.X)
identical(pad1, pad2)
#> [1] TRUE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM