为什么Jenks算法这么慢?

时间:2014-03-01 23:29:00

标签: r algorithm

我想运行Jenks的算法来查找数据中的自然中断。有一个名为classInt的包,它有一个函数,但是我需要在我无法安装软件包的机器上使用它,也不需要编译任何东西,它必须在基础R中完成。所以我查看了源代码和复制相关部分以创建jenks()函数。 然而,这个功能非常慢!对于长度为300的单个数字向量,需要0.8秒。

我无法弄清楚为什么,它只是几个用于预分配内存的矩阵上的循环。分析器说大部分时间都用在' - '函数中。有没有办法加快速度?

谢谢!

jenks <- function (var, n = 5) {
  ovar <- var

  d <- sort(var)
  k <- n
  mat1 <- matrix(1, length(d), k)
  mat2 <- matrix(0, length(d), k)
  mat2[2:length(d), 1:k] <- .Machine$double.xmax
  v <- 0

  for (l in 2:length(d)) {
    s1 = s2 = w = 0
    for (m in 1:l) {
      i3 <- l - m + 1
      val <- d[i3]
      s2 <- s2 + val * val
      s1 <- s1 + val
      w <- w + 1
      v <- s2 - (s1 * s1)/w
      i4 <- trunc(i3 - 1)
      if (i4 != 0) {
        for (j in 2:k) {
          if (mat2[l, j] >= (v + mat2[i4, j - 1])) {
            mat1[l, j] <- i3
            mat2[l, j] <- v + mat2[i4, j - 1]
          }
        }
      }
    }
    mat1[l, 1] <- 1
    mat2[l, 1] <- v
  }

  kclass <- 1:k
  kclass[k] <- length(d)
  k <- length(d)
  last <- length(d)
  for (j in length(kclass):1) {
    id <- trunc(mat1[k, j]) - 1
    kclass[j - 1] <- id
    k <- id
    last <- k - 1
  }
  brks <- d[c(1, kclass)]


  res <- list(var = ovar, brks = brks)
  res
}

0 个答案:

没有答案