Skip to content

help me avoid nested for() loops!

4 messages · Andrew Barr, Charles C. Berry, Dylan Beaudette +1 more

#
Hi R folks,

I have a massive array (object name "points") in the following form

     [,1]     [,2]
[1,] 1369   22
[2,] 1370   22
[3,] 1368   23
[4,] 1369   23
[5,] 1370   23
[6,] 1371   23
(10080 rows truncated)

These represent pixel coordinates of interest in a jpeg image.  I need
to find the distance from each point to all other points of interest.
The only way I can see to do this is by pythagoras and nested for
loops.

distance<-function(x1,y1,x2,y2){sqrt((x2-x1)^2 + (y2-y1)^2)} #pythagoras
for(i in 1:nrow(points)){
	for(j in 1:nrow(points)){
	dist<-c(dist,distance(points[i,1],point.array.indices[i,2],points[j,1],points[j,2]))
}
}

This is obviously prohibitively slow with >10000 rows in the array.

Any thoughts on how to do this without for loops? I apologize in
advance if there is an obvious way around this.

Thanks!

Andrew Barr
University of Texas at Austin
#
On Fri, 20 Nov 2009, Andrew Barr wrote:

            
Apology accepted.

The obvious way is to follow the posting guide:

 	?distance  ## suggests trying ??distance
 	??distance ## lists stats::dist
 	?dist      ## Mmmmm!

HTH,

Chuck
Charles C. Berry                            (858) 534-2098
                                             Dept of Family/Preventive Medicine
E mailto:cberry at tajo.ucsd.edu	            UC San Diego
http://famprevmed.ucsd.edu/faculty/cberry/  La Jolla, San Diego 92093-0901
#
?dist
On Friday 20 November 2009, Andrew Barr wrote:

  
    
#
On Nov 20, 2009, at 5:05 PM, Andrew Barr wrote:

            
mtx <- matrix(scan(textConnection("1369   22
  1370   22
  1368   23
  1369   23
  1370   23
  1371   23")), ncol=2, byrow=TRUE)

 > dist(mtx)
          1        2        3        4        5
2 1.000000
3 1.414214 2.236068
4 1.000000 1.414214 1.000000
5 1.414214 1.000000 2.000000 1.000000
6 2.236068 1.414214 3.000000 2.000000 1.000000
I'm not sure that your request to make this fast is reasonable. The  
size of the resulting matrix will be more than most Windows machines  
will support.
I can do that operation in 8 characters ... but ...
I think you should be thinking about apologizing for expecting a  
relaxation of the laws of combinatorics and geometry.
David Winsemius, MD
Heritage Laboratories
West Hartford, CT