Home > Software engineering >  Deriving an adjacency matrix wrt distance
Deriving an adjacency matrix wrt distance

Time:02-24

Let's suppose that I have n points, and a square numpy matrix where i,j'th entry is filled with the distance between the point i and point j. How can I derive an adjacency matrix in a way that, there is an "edge" between point a and point b if for every other point c, max(dist(c,a), dist(c,b)) > dist(a,b), in other words there is not any other point c such as c is closer to a and b than, a and b are to each other. I could write this in numpy with some for loops, but I wonder if there is any easier/faster way to do so.

EDIT: I think it is kinda similar to finding the 'closure' of points. e.g, if we have 4 vertices of a rectangle we only draw the sides (4 edges)

CodePudding user response:

This is really hard to do without a concrete example, so I may be getting this slightly wrong.

So you have an nxn matrix (presumably symmetric with a diagonal of 0) representing the distances. Let's call this matrix A.

Then A[:,None,:] is an nx1xn matrix such that if you broadcast it to nxnxn, then A[i, j, k] is the distance from the i'th point to the k'th point. Likewise, A[None, :, :], when broadcast to nxnxn, gives a matrix such that A[i, j, k] gives the distance from the j'th point to the kth point.

So B = np.maximum(A[:,None,:],A[None,:,:]) is an array such at b[i, j, k] is the maximum of the distance from i to k or from j to k. Take the minimum of B along the last dimension, and you've got the value for the best possible k. Edges are those values for which np.min(B, axis=2) <= A.

Again, try this out on your own computer. I may have slight details wrong.

  • Related