有人可以指出一些关于给定集合 n 的算法的阅读,它将其元素放在更大的集合 m 中,均匀分布(尽可能)。我计划对剩余的值进行插值。
所以我有一组 3 个元素,其中包含
1 ,5 ,6
我想尽可能地将它分布在 10 个插槽的数据帧中,第一个和最后一个元素是第一个和最后一个相应的新集合:
1 [] [] [] 5 [] [] [] [] 6
提前致谢。
PS。我正在尝试用 R 来实现这一点
有人可以指出一些关于给定集合 n 的算法的阅读,它将其元素放在更大的集合 m 中,均匀分布(尽可能)。我计划对剩余的值进行插值。
所以我有一组 3 个元素,其中包含
1 ,5 ,6
我想尽可能地将它分布在 10 个插槽的数据帧中,第一个和最后一个元素是第一个和最后一个相应的新集合:
1 [] [] [] 5 [] [] [] [] 6
提前致谢。
PS。我正在尝试用 R 来实现这一点
我考虑回答你的问题,但后来我想到了最终目标,在我看来,生成具有较小矢量均匀分布的矢量将不容易促进插值。以下为您提供插值向量。
bigLength <- 10
data <- c(1, 5, 6)
n <- length(data) - 1
breakLength <- bigLength / n
breaks <- floor(rep(breakLength+1, n))
breaks[1] <- breaks[1]-1
extra <- bigLength %% n
if (extra > 0) for(i in 1:extra) breaks[i] <- breaks[i]+1
y <- unlist ( lapply(1:n, function(i){
y <- seq(data[i], data[i+1], length.out = breaks[i])
return(y[-1])
}) )
y <- c(data[1], y)
y
我认为你应该使用术语“向量”,无论如何,它在 R 中具有这个问题所需的位置和长度的概念。(数学集合是无序的,所以没有位置解释,R 确实有集合运算符和函数。)
# Make up an empty vector:
vec <- vector("numeric", length=10)
# create a vector of items to place
items <- c(1,5,6)
#Put the first one in the first empty "slot" and the last in the last/
vec[1] <- items[1]
vec[length(vec)] <- items[length(items)]
#Now find a positions for the remaining element(s)
seq(1,length(vec), by=length(vec)/(length(items)-1))[-c(1,length(items))]
#[1] 6
# And place them (or it in this case) ....
vec[ seq(1,length(vec), by=length(vec)/(length(items)-1))[
-c(1,length(items))] ] <-
items[ -c(1,length(items)) ]
vec
# [1] 1 0 0 0 0 5 0 0 0 6
即使认为“集合”的概念在这里有点奇怪,您可能想要执行直方图归一化(有时称为对比度拉伸)或直方图均衡化之类的操作。