[R] Efficient way to convert covariance to Euclidian distance matrix

Rolf Turner r.turner at auckland.ac.nz
Fri Nov 1 00:01:00 CET 2013


On 10/31/13 23:14, Takatsugu Kobayashi wrote:
> Hi RUsers,
>
> I am struggling to come up with an efficient vectorized way to convert
> 20Kx20K covariance matrix to a Euclidian distance matrix as a surrogate for
> dissimilarity matrix. Hopefully I can apply multidimensional scaling for
> mapping these 20K points (commercial products).
>
> I understand that Distance(ij) = sigma(i) + sigma(j) - 2cov(ij). Without
> replying on a slow loop, I appreciate if anyone can help me out with a
> better idea - guess lapply?

As S. Ellison has pointed out, you probably want sigma^2 rather than sigma.

My suspicion is that with a 20K x 20K covariance matrix:

     * nothing will work

     * even if it did, the results would be meaningless numerical noise.

I.e.  Get real.

That being said, for a *reasonable* size of covariance matrix, the 
following might
do what you want:

     DM <- outer(diag(CM),diag(CM),"+") - 2*CM

where "CM" is the covariance matrix.  And then you might want to do

     DM <- sqrt(DM)

to get back to the original units (as S. Ellison indicated).

     cheers,

     Rolf Turner



More information about the R-help mailing list