是否存在可绘制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
相关产品推荐
相关产品推荐

