# # elegant functions to minimize sstress # # version 0.0.1 2006-02-06 (first attempt, symmetric case) # version 0.0.2 2006-02-07 (added rectangular case) # version 0.1.0 2006-02-09 (fixed rectangular case) # version 0.1.1 2006-02-09 (got rid of large matrix multiplication) # version 0.1.2 2006-02-09 (improved stepsize) # version 0.2.0 2006-02-09 (introduced linear restrictions in symmetric case) # version 0.2.1 2006-02-20 (put in alternative cheaper bounds) # version 0.2.2 2006-02-22 (no weights, no matrix storage) # require("mdsutils") elegantSym<-function( delta, p=2, w=1, bnd="norm", init="none", verbose=TRUE, itmax=500, eps=1e-6) { n<-dim(delta)[1]; itel<-1 if (!is.matrix(init)) x<-torgerson(sqrt(delta),p=p) else x<-init if (!is.matrix(w)) sbd<-2*n else if (bnd == "norm") sbd<-4*max(rowSums(w)) else sbd<-symBound(w) d<-dist2Sym(x); r<-delta-d; sstress=sum(w*r*r)/2; psstress<-sstress repeat { v<--w*r; diag(v)<--rowSums(v); x<-x+t(qr.solve(x,v))/sbd d<-dist2Sym(x); r<-delta-d; sstress=sum(w*r*r)/2 if (verbose) { cat("Iteration: ",formatC(itel,digits=6,width=6), " SStress: ",formatC(psstress,digits=6,width=12,format="f"), " ==>",formatC(sstress,digits=6,width=12,format="f"),"\n") } if (((psstress-sstress)",formatC(sstress,digits=6,width=12,format="f"),"\n") } if (((psstress-sstress)",formatC(sstress,digits=6,width=12,format="f"),"\n") } if (((psstress-sstress)