You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在可绘制Smith–Volterra–Cantor集的类似cantor()函数?

解答

目前geostats包内置的cantor()函数没有提供直接生成Smith–Volterra–Cantor集(胖康托集)的参数,也没有同包其他内置函数可以直接实现这个需求,不过你只要改几行cantor()的内部逻辑就能自己实现,没必要专门找现成函数。

两者的核心逻辑差异很小:

  • 常规Cantor集每次迭代把当前所有区间三等分,移除中间长度占比1/3的开区间,最终集合测度为0
  • Smith–Volterra–Cantor集每次迭代移除的中间区间长度逐次递减:第一步移除1/4长度的中间段,之后每一步移除的区间长度是上一步移除长度的1/4,最终集合测度为1/2,除了区间裁剪规则,其余绘图逻辑和常规Cantor集完全一致。

下面是和原生cantor()使用风格、输出效果完全对齐的改写版本,可以直接调用:

sv_cantor <- function(n = 5, add = FALSE, ...) {
  intervals <- matrix(c(0, 1), ncol = 2)
  
  for (i in seq_len(n)) {
    new_intervals <- matrix(ncol = 2, nrow = 0)
    current_remove_len <- 1/4^i
    for (j in seq_len(nrow(intervals))) {
      l <- intervals[j, 1]
      r <- intervals[j, 2]
      seg_len <- r - l
      rl <- l + (seg_len - current_remove_len)/2
      rr <- r - (seg_len - current_remove_len)/2
      new_intervals <- rbind(new_intervals, c(l, rl), c(rr, r))
    }
    intervals <- new_intervals
  }
  
  if (!add) {
    plot(NULL, xlim = c(0,1), ylim = c(0, n+1),
         xlab = "x", ylab = "迭代步数", axes = FALSE)
    axis(1)
    axis(2, at = 0:n, labels = 0:n)
  }
  apply(intervals, 1, function(seg) segments(seg[1], 1, seg[2], 1, ...))
  if (n > 0) sv_cantor(n-1, add = TRUE, ...)
  invisible(intervals)
}

# 调用示例
library(geostats)
sv_cantor(n = 6, lwd = 2, col = "#2c7fb8")

要是你不需要和原生cantor()的视觉风格对齐,甚至可以不用依赖geostats包,只要按迭代规则算好每一步保留的区间,用基础绘图函数画线就行。这类康托集变种的规则差异基本都在迭代裁剪逻辑上,很少有工具包会给每一种细分变种单独封装函数,自己改写是效率最高的方案。

内容的提问来源于stack exchange,提问作者Pan Miroslav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 06:36:37