谁能给我指出一些关于给定集合n的算法,将其元素放置在更大的集合m中,均匀间隔(尽可能多)。我计划对剩下的值进行插值。
我有一个包含
的3个元素的集合 1 ,5 ,6
,我想把它尽可能均匀地分布在一个有10个槽的数据帧中,第一个和最后一个元素相应地是新集合中的第一个和最后一个元素:
1 [] [] [] 5 [] [] [] [] 6
提前感谢。
p。我正试图用R
我认为你应该使用术语"向量",无论如何,在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
我考虑回答你的问题,但后来我想到了最终目标,在我看来,用较小的均匀分布的向量生成你的向量将不容易促进插值。下面的代码可以得到插值向量。
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
尽管"集合"的概念在这里有点奇怪,但您可能想要做一些类似直方图规范化(有时称为对比度拉伸)或直方图均衡化的事情。