</pre><pre name="code" class="html">getTargetPoint <- function(data, k, method = 'euclidean'){
#找第i个最远的点
#n,点的个数,即为distMatrix行数
getPos <- function(pos, distMatrix, n){
#得到第i个点离选出的点的距离最小值
i <- length(pos) + 1
getMinDist <- function(pos, distMatrix, i){
min <- distMatrix[pos[1], i]
for(a in pos){
if(min > distMatrix[a, i]){
min <- distMatrix[a, i]
}
}
return(min)
}
#距离最小值最大
p <- 0
max <- 0
for(a in 3:n){
minDist <- getMinDist(pos, distMatrix, a)
if(max < minDist){
max <- minDist
p <- a
}
}
return(p)
}
data <- as.matrix(data)
size <- dim(data)
if(k<2 | k>size[1]){
return(matrix())
}
distMatrix <- as.matrix(dist(data, method, upper = T, diag = T))
#先找两个最远的点
maxDist <- distMatrix[2, 1]
pos <- c(0, 0)
for(i in 2:size[1]){
for(j in 1:(i-1)){
if(maxDist < distMatrix[i, j]){
maxDist <- distMatrix[i, j]
pos[1] <- i
pos[2] <- j
}
}
}
result <- matrix(rep(0, size[2] * k), nrow = k)
result[1, ] <- data[pos[1], ]
result[2, ] <- data[pos[2], ]
if(k==2){
return(result)
}
#找剩下的k-2个点
for(i in 3:k){
pos[k] <- getPos(pos, distMatrix, size[1])
result[i, ] <- data[pos[k], ]
}
return(result)
}
data <- matrix(data = c(1,2,3,4,5,5,7,8), nrow = 4)
getTargetPoint(data = data, k = 3)
#结果
#> getTargetPoint(data = data, k = 3)
# [,1] [,2]
#[1,] 4 8
#[2,] 1 5
#[3,] 3 7