1

我想将 mapply 与矩阵一起使用,该矩阵使用包含这样的 if 的函数:

dim_rf <- 10

rf <- matrix(runif(dim_rf*dim_rf),ncol=dim_rf)


fire_rf <- function(i,j) {
  if(rf[i,j+1] + rf[i+1,j] + rf[i,j-1] + rf[i-1,j]>1)
    rf[i,j] <-2
}

mapply(fire_rf, row(rf), col(rf)  ) 

但它给出了一个错误

Error en if (rf[i, j + 1] + rf[i + 1, j] + rf[i, j - 1] + rf[i - 1, j] >  : 

参数长度为零

如何修改函数以使其工作?

我正在用它来做一个简单的火灾渗透模型,所以它需要很快,因为矩阵的大小应该是 100 或 1000 大

4

2 回答 2

2

我猜这就是你想要的。您的循环条件错误,导致算法超出范围。

dim_rf <- 10
rf <- matrix(runif(dim_rf*dim_rf),ncol=dim_rf)
fire_rf <- function(i,j) {
    if((rf[i,j+1] + rf[i+1,j] + rf[i,j-1] + rf[i-1,j])>1)
         rf[i,j] <<-2
}
mapply(fire_rf, 2:(nrow(rf)-1), 2:(ncol(rf)-1))

希望这可以帮助。:)

PS。另请注意,我将本地分配更改为全局分配。如果这不是你想要的,你可以把它改回来。

于 2013-07-17T12:08:32.163 回答
1

这将帮助您调试函数:

fire_rf <- function(i,j) {
  print(paste(i, j))
  print(paste(rf[i,j+1], rf[i+1,j], rf[i,j-1], rf[i-1,j]))
}

R> mapply(fire_rf, row(rf), col(rf)) 
[1] "1 1"
[1] "0.431833460461348 0.723794676829129  "
[1] "2 1"
[1] "0.61886831978336 0.764425948029384  0.486255120486021"
[1] "3 1"
[1] "0.98786562983878 0.416759668383747  0.723794676829129"
[1] "4 1"
[1] "0.516932599013671 0.66259386530146  0.764425948029384"
[1] "5 1"
[1] "0.770237588090822 0.844016372924671  0.416759668383747"
[1] "6 1"
[1] "0.519682829733938 0.273759116884321  0.66259386530146"
[1] "7 1"
[1] "0.0957026474643499 0.32785635185428  0.844016372924671"
[1] "8 1"
[1] "0.380909610772505 0.164877543691546  0.273759116884321"
[1] "9 1"
[1] "0.509409713326022 0.614429801469669  0.32785635185428"
[1] "10 1"
Error in rf[i + 1, j] : subscript out of bounds
Calls: mapply -> <Anonymous> -> print -> paste

当你认为你正在传递参数时,你会看到,有时你不是,有时你传递的比那里更多。你需要考虑那些'i - 1','j - 1'和'i + 1'和'j + 1'。如果您真的想这样做,我建议您编写一个直接循环。

于 2013-07-17T12:16:50.783 回答