I tihnk I did it.
library(tidyverse)
point1c = c(0.25, 0.8, 0.4)
point2c = c(0.11, 0.5, 0.3)
# point3m = random
# point4m = random
# point5m = random
(initial_matrix<- matrix(data=c(point1c,point2c),
nrow=3) %>% t())
eval_distance <- function(m,target){
mat <- (dist(m) %>% as.matrix())
ltri <- mat[lower.tri(mat)]
sub_dists2 <-ltri-target
res <- sum (sub_dists2^2)^.5
cat ("\ndistance ", res,"\n")
invisible(res)
}
(initial_dist <- eval_distance(initial_matrix,0))
set.seed(42)
(full_matrix_1 <- matrix(
data=c(point1c,point2c,sample.int(100,6, replace=TRUE)/100),
nrow=3) %>% t())
eval_distance(full_matrix_1,initial_dist)
compose_new_matrix_and_eval <- function(p,printmatrix=FALSE,return_only_eval=TRUE){
p3x <- p[1]
p3y <- p[2]
p3z <- p[3]
p4x <- p[4]
p4y <- p[5]
p4z <- p[6]
p5x <- p[7]
p5y <- p[8]
p5z <- p[9]
dlist <- c(point1c,
point2c,
p3x,p3y,p3z,
p4x,p4y,p4z,
p5x,p5y,p5z)
new_mtrx <- matrix(
data=dlist,
nrow=3) %>% t()
if(printmatrix) print(new_mtrx)
e_dist <- eval_distance(new_mtrx,initial_dist)
if(return_only_eval)
return(e_dist)
else
return(list(eval_distance=e_dist,
matrix =new_mtrx ))
}
optim_result <- optim(sample.int(100,9, replace=TRUE)/100,
compose_new_matrix_and_eval,control=list(maxit=10000))
optim_result
(final_result <- compose_new_matrix_and_eval(optim_result$par,
printmatrix = TRUE,
return_only_eval = FALSE))
eval_distance(final_result$matrix,initial_dist) %>% as.numeric()
final_result$matrix
dist(final_result$matrix)
> final_result$matrix
[,1] [,2] [,3]
[1,] 0.2500000 0.8000000 0.4000000
[2,] 0.1100000 0.5000000 0.3000000
[3,] 0.2036149 0.4945767 0.5810320
[4,] 0.4761734 0.5779608 0.5022559
[5,] 0.3950926 0.5248427 0.2226770
> dist(final_result$matrix)
1 2 3 4
2 0.3458323
3 0.3580608 0.2962636
4 0.3330346 0.4255212 0.2957138
5 0.3580598 0.2964352 0.4074286 0.2959054