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:> 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.Apology accepted. The obvious way is to follow the posting guide: ?distance ## suggests trying ??distance ??distance ## lists stats::dist ?dist ## Mmmmm! HTH, Chuck> > Thanks! > > Andrew Barr > University of Texas at Austin > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >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:> 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],poi >nts[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 > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html and provide commented, minimal, > self-contained, reproducible code.-- Dylan Beaudette Soil Resource Laboratory http://casoilresource.lawr.ucdavis.edu/ University of California at Davis 530.754.7341
On Nov 20, 2009, at 5:05 PM, Andrew Barr wrote:> 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)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> > 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.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.> > Any thoughts on how to do this without for loops?I can do that operation in 8 characters ... but ...> I apologize in > advance if there is an obvious way around this.I think you should be thinking about apologizing for expecting a relaxation of the laws of combinatorics and geometry.> > Thanks! > > Andrew Barr > University of Texas at Austin > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.David Winsemius, MD Heritage Laboratories West Hartford, CT