"cmdscale"<-
function(d, k = 2, eig = FALSE)
{
	if(any(is.na(d)))
		stop("NA values not allowed in d")
	if(is.null(n <- attr(d, "Size"))) {
		x <- as.matrix(d)
		if((n <- nrow(x)) != ncol(x))
			stop("Distances must be result of dist or a square matrix")
	}
	else {
		x <- matrix(0, n, n)
		x[row(x) > col(x)] <- -0.5 * d^2
		x <- x + t(x)
	}

	storage.mode(x) <- "double"
	e <- eigen(.C("dblcen", x, as.integer(n))[[1]])
	ev <- e$values[n:(n-k+1)]
	points <- e$vectors[,n:(n-k+1)] %*% diag(sqrt(ev))
	if(eig) list(points=points, eig=ev)
	else points
}
