Re: [R] ugly loop

From: Marc Schwartz <MSchwartz_at_medanalytics.com>
Date: Fri 22 Apr 2005 - 23:44:30 EST

On Fri, 2005-04-22 at 09:31 -0400, Bill Simpson wrote:
> Thanks Marc for your help.
>
> > > The following code is slow and ugly:
> > >
> > > count<-0
> > > for(i in 1:nrow(ver))
> > > for(j in 1:ncol(ver))
> > > {
> > > count<-count+1
> > > x[count]<-pt$x[ver[i,j]]
> > > y[count]<-pt$y[ver[i,j]]
> > > z[count]<-pt$z[ver[i,j]]
> > > }
> > >
> > > Please help me make it better.
> > >
> > > Thanks!
> >
> > The following should work:
> >
> > > ver <- matrix(sample(1:16, 16), ncol = 4)
> > > pt <- data.frame(x = sample(1:16, 16),
> > + y = sample(1:16, 16),
> > + z = sample(1:16, 16))
> >
> > > ver
> > [,1] [,2] [,3] [,4]
> > [1,] 8 9 5 13
> > [2,] 14 16 1 10
> > [3,] 12 2 11 7
> > [4,] 6 3 4 15
> > > pt
> > x y z
> > 1 6 15 15
> > 2 9 2 3
> > 3 11 1 5
> > 4 14 4 10
> > 5 13 7 14
> > 6 1 14 7
> > 7 15 10 4
> > 8 10 5 12
> > 9 4 12 2
> > 10 8 8 13
> > 11 16 11 1
> > 12 7 13 9
> > 13 2 16 11
> > 14 3 9 16
> > 15 5 6 8
> > 16 12 3 6
> >
> > > x <- pt$x[ver]
> > > y <- pt$y[ver]
> > > z <- pt$z[ver]
> This doesn't give the same results as my original code -- it scrambles the
> order.
>
> OK I will explain my example.
>
> pts contains the x, y, z coordinates of some 3D points. These points are
> the vertices of 3D triangles.
>
> ver contains the indexes into pts.
>
> each line of ver contains 3 vertices -- they are the corners of a
> triangle. For example, if line 1 of ver is
> 10 9 7
> That means I need to draw a triangle whose coordinates are
> pt$x[10],pt$y[10],pt$z[10]
> pt$x[9],pt$y[9],pt$z[9]
> pt$x[7],pt$y[7],pt$z[7]
>
> Now it should be clear why the ordering is critical.
> I am using rgl.triangles() to plot. It requires the x,y,z coordinates in
> the order I gave in my original code.

That's what I get for not comparing your results against my own. I just noted that you are going by row and not by column. So, using the same data above:

> count<-0
> for(i in 1:nrow(ver))

+   for(j in 1:ncol(ver))
+     {
+     count<-count+1
+     x[count]<-pt$x[ver[i,j]]
+     y[count]<-pt$y[ver[i,j]]
+     z[count]<-pt$z[ver[i,j]]
+     }

> x

 [1] 10 4 13 2 3 12 6 8 7 9 16 15 1 11 14 5
> y

 [1] 5 12 7 16 9 3 15 8 13 2 11 10 14 1 4 6
> z

 [1] 12 2 14 11 16 6 15 13 9 3 1 4 7 5 10 8

Thus, I just need to use t(ver) instead of ver:

> x <- pt$x[t(ver)]
> y <- pt$y[t(ver)]
> z <- pt$z[t(ver)]
 

> x

 [1] 10 4 13 2 3 12 6 8 7 9 16 15 1 11 14 5
> y

 [1] 5 12 7 16 9 3 15 8 13 2 11 10 14 1 4 6
> z

 [1] 12 2 14 11 16 6 15 13 9 3 1 4 7 5 10 8

That should do it?

HTH, Marc
<Off to make another pot of coffee....>



R-help@stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html Received on Fri Apr 22 23:52:30 2005

This archive was generated by hypermail 2.1.8 : Fri 03 Mar 2006 - 03:31:22 EST