Rev 6869 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
c Dysta() :cc Compute Distances from X matrix {also for agnes() and diana()}:c -----------------------------------------------------------cc was part of pam.f --- now called both from Fortran & Cc "keep in sync" with daisy.f {move both to C or replace by R's dist!}csubroutine dysta(nn,p,x,dys,ndyst,jtmd,valmd,jhalt)integer nn, p, ndyst, jtmd(p), jhaltdouble precision x(nn,p), dys(1+nn*(nn-1)/2), valmd(p)c ndyst = 1 : euclideanc "else"(2) : manhattanc VARsinteger nlk,j,l,k, lsubt, npresdouble precision pp, clk, rpresnlk=1dys(1)=0.0c ---------- is used potentially for d[i,i] == dys[1] == 0pp=pdo 100 l=2,nnlsubt=l-1do 20 k=1,lsubtclk=0.0nlk=nlk+1npres=0do 30 j=1,pif(jtmd(j).lt.0) then ! some x(*,j) are missing (NA)if(x(l,j).eq.valmd(j))goto 30if(x(k,j).eq.valmd(j))goto 30endifnpres=npres+1if(ndyst.eq.1) thenclk=clk+ (x(l,j)-x(k,j))*(x(l,j)-x(k,j))elseclk=clk+ dabs(x(l,j)-x(k,j))endif30 continuerpres=npresif(npres.eq.0) thenjhalt=1dys(nlk)=-1.0elseif(ndyst.eq.1) thendys(nlk)= dsqrt(clk*(pp/rpres))elsedys(nlk)= clk*(pp/rpres)endifendif20 continue100 continueend