elbow 求拐点

it2022-05-05  115

distancePointLine <- function(x, y, slope, intercept) {  ## x, y is the point to test.  ## slope, intercept is the line to check distance.  ##  ## Returns distance from the line.  ##  ## Returns 9999 on 0 denominator conditions.  x1 <- x-10  x2 <- x+10  y1 <- x1*slope+intercept  y2 <- x2*slope+intercept  distancePointSegment(x,y, x1,y1, x2,y2)}distancePointSegment <- function(px, py, x1, y1, x2, y2) {  ## px,py is the point to test.  ## x1,y1,x2,y2 is the line to check distance.  ##  ## Returns distance from the line, or if the intersecting point on the line nearest  ## the point tested is outside the endpoints of the line, the distance to the  ## nearest endpoint.  ##  ## Returns 9999 on 0 denominator conditions.  lineMagnitude <- function(x1, y1, x2, y2) sqrt((x2-x1)^2+(y2-y1)^2)  ans <- NULL  ix <- iy <- 0   # intersecting point  lineMag <- lineMagnitude(x1, y1, x2, y2)  if( lineMag < 0.00000001) {    warning("short segment")    return(9999)  }  u <- (((px - x1) * (x2 - x1)) + ((py - y1) * (y2 - y1)))  u <- u / (lineMag * lineMag)  if((u < 0.00001) || (u > 1)) {    ## closest point does not fall within the line segment, take the shorter distance    ## to an endpoint    ix <- lineMagnitude(px, py, x1, y1)    iy <- lineMagnitude(px, py, x2, y2)    if(ix > iy)  ans <- iy    else ans <- ix  } else {    ## Intersecting point is on the line, use the formula    ix <- x1 + u * (x2 - x1)    iy <- y1 + u * (y2 - y1)    ans <- lineMagnitude(px, py, ix, iy)  }  ans}###############################################mydata = read.table('clipboard',header = T)###########################mydata=cbind(c(1:15),wss)#########################datanumber = nrow(mydata)mydist = c()for(i in c(1:datanumber)){  d = as.numeric(c(mydata[i,],mydata[1,],mydata[datanumber,]))  mydist[i] = distancePointSegment(d[1],d[2],d[3],d[4],d[5],d[6])  }mydistmax(mydist)################filternew = filter(mydist,filter = c(rep(1/datanumber,3)))#plot(filternew)################elbowpoints = which(mydist==max(mydist))plot(mydist)abline(v=elbowpoints,lty=2,col='red')plot(x=mydata[,1],y=mydata[,2],type='l')elbowp = mydata[elbowpoints,1]elbowpabline(v=elbowp,lty=2,col='red')

转载于:https://www.cnblogs.com/arcserver/p/9186008.html

相关资源:各显卡算力对照表!

最新回复(0)