Okay I have tried your script on some basic vectors for testing and they
worked without problem (although I had to add return 1 to the end of the
script cause it gives the error that the script does not return a true
value).

Thanks for the help

On Wed, Apr 30, 2008 at 9:29 PM, Roban Kramer <[EMAIL PROTECTED]>
wrote:

> Yes, that should be correct. The code I wrote is just to deal with the
> little details of doing that in the context of PDL::Transform::Linear
>
> By the way, I cut off the bottom of the code I sent out before.
> Attached is the complete subroutine. You use it like this, where
> $xform1 and $xform2 are PDL::Transform::Linear objects:
>
>  $new_xform = t_compose_linear($xform1, $xform2);
>
> On Wed, Apr 30, 2008 at 1:21 PM, Sina Türeli <[EMAIL PROTECTED]> wrote:
> > Err about composing linear transformations... If I find the seperate
> > transformation matrices required, isnt it enough that I just multiply
> them
> > to find the composite transformation matrix? Say three seperately applied
> > rotation matrices do what I want, isnt the composed matrix the
> multplication
> > of the three?
> >
> >
> >
> > On Wed, Apr 30, 2008 at 6:09 PM, Roban Kramer <[EMAIL PROTECTED]>
> > wrote:
> >
> > > A while ago I wrote code to mathematically compose linear
> > > transformations. I make no guarantee of its correctness or robustness,
> > > but it might be useful to someone:
> > >
> > > =head2 t_compose_linear
> > >
> > > Mathematically compose transformations and combine the C<pre> and
> > > C<post> translations into a single C<post> translation. The
> > > C<t_compose> function just does the transformations in order, while
> > > this function creates a single mathematical transformation.
> > >
> > > =cut
> > >
> > > sub t_compose_linear{
> > >  my (@t_in) = @_;
> > >
> > >  # set up the initial output matrix and post translation
> > >  my $out_matrix = identity($t_in[-1]->{'params'}->{'matrix'});
> > >  my $out_post = zeroes($out_matrix->dim(-1));
> > >
> > >  foreach my $in (reverse @t_in) {
> > >    # check to make sure we have the right type of transformation
> > >    unless(UNIVERSAL::isa($in,'PDL::Transform::Linear')) {
> > >      Carp::cluck( "PDL::Transform::t_inverse_linear:  ".
> > >                   "got a transform that is not linear.\n"
> > >                 );
> > >      return undef;
> > >    }
> > >    unless(defined $in->{params}->{inverse}) {
> > >      Carp::cluck( "PDL::Transform::t_inverse_linear:  ".
> > >                   "got a transform with no inverse.\n"
> > >                 );
> > >      return undef;
> > >    }
> > >
> > >    my $in_matrix = $in->{'params'}->{'matrix'};
> > >
> > >    # get the post and pre translations of the input xform
> > >    my $in_post = topdl($in->{'params'}->{'post'});
> > >    my $in_pre = topdl($in->{'params'}->{'pre'});
> > >    $in_post = $in_post->copy();
> > >    $in_pre = $in_pre->copy();
> > >
> > >    # if they're single element piddles, make them vectors
> > >    $in_post = $in_post * ones($in_matrix->dim(1))
> > >      if ($in_post->nelem() < $in_matrix->dim(1));
> > >    $in_pre = $in_pre * ones($in_matrix->dim(1))
> > >      if ($in_pre->nelem() < $in_matrix->dim(1));
> > >
> > >    # now combine the pre and post translations into a single post
> > >    $in_post = $in_post + ($in_pre x $in_matrix);
> > >
> > >    # and convert that into the combined post translation
> > >    $out_post = $in_post + matmult($out_post,$in_matrix);
> > >    $out_matrix = $out_matrix x $in_matrix;
> > >  }
> > >
> > >
> > > On Wed, Apr 30, 2008 at 8:52 AM, Craig DeForest
> > >
> > >
> > >
> > > <[EMAIL PROTECTED]> wrote:
> > > >
> > > > That would be the part in NOTES where it says
> > > >
> > > >
> > > >    Composition works OK but should probably be done in a more
> > sophisticated
> > > >     way so that, for example, linear transformations are combined at
> the
> > > >     matrix level instead of just strung together pixel-to-pixel.
> > > >
> > > > For 100-10,000 coordinates you shouldn't worry.  That will fit
> entirely
> > in
> > > > the CPU cache for most modern machines, so the performance hit isn't
> > bad.
> > > > When I say build your own rotation matrix, I mean as a PDL using
> > elementwise
> > > > calculation or matrix multiplication.
> > > >
> > > > The comment in the notes, and the point I made, is that if you have
> > three
> > > > linear operators to string together, it is much faster (54
> > multiplications)
> > > > to multiply your three 3x3 matrices together, than to apply each
> matrix
> > in
> > > > order with the data (27 times 3N multiplications).  But with only
> (say)
> > 1000
> > > > points, that means each operation will take under 9000
> multiplications,
> > or
> > > > about 30-100 microseconds if you're using a recent machine and the
> data
> > are
> > > > in CPU cache.
> > > >
> > > > My suggestion: try it using the Transform composition; if it is too
> > slow,
> > > > you can make it faster by applying your composition Transform to the
> > > > identity matrix, and then pass the resulting matrix into t_linear to
> > make a
> > > > single transform.
> > > >
> > > > Cheers,
> > > > Craig
> > > >
> > > > On Apr 30, 2008, at 6:31 AM, Sina Türeli wrote:
> > > >
> > > > Okay this part seems important. Where in the documentation does it
> write
> > > > that? So if to rotate around an arbitrary axis, I compose three
> rotation
> > > > matrices T^-1.R.T<v>, where T takes the arbitrary axis to x axis, R
> does
> > the
> > > > rotation around x axis and T^-1 maps the arbitrary axis back to its
> > original
> > > > direction how much of an inefficiency are we talking about. This is
> > likely
> > > > to operate on a data set of anywhere between 100 to 10000
> coordinates.
> > These
> > > > T and R operators are all t_linear rotation operator in PDL. When
> saying
> > > > build your own rotation matrix do you mean from scratch and by just
> > using
> > > > multplication and inverse operations defined in PDL and not any
> t_linear
> > > > opeartions...
> > > >
> > > > Thanks alot for your help
> > > >
> > > > On Tue, Apr 29, 2008 at 11:23 PM, Craig DeForest
> > <[EMAIL PROTECTED]>
> > > > wrote:
> > > >
> > > > >
> > > > >
> > > > > You can compose transformations to get to the axis you want, but as
> > you
> > > > will have seen in the documentation it is inefficient because the
> code
> > just
> > > > strings the transformations together. If your data are big then you
> will
> > > > want instead to build your own rotation matrix (or extract the one in
> > the
> > > > transform) to minimize the number of passes. You can still use
> Transform
> > to
> > > > encapsulate the operations, which is good in case you later want to
> > > > generalize.  t_linear will accept a matrix if you want.
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > On Apr 29, 2008, at 1:26 PM, "Sina Türeli" <[EMAIL PROTECTED]>
> > wrote:
> > > > >
> > > > >
> > > > >
> > > > >
> > > > > Thanks for the answers. One more question, is there any build in
> > function
> > > > for rotationa around an arbitrary axis of the object? If there isnt I
> am
> > > > planning to first rotate all the object so that the arbitrary axis
> > concides
> > > > with say x axis, rotate the object around the x axis and apply the
> > inverse
> > > > of the first transformation to put the arbirtrary axis back in its
> > place.
> > > > But somehow this seems computationally really inefficient. I am might
> > also
> > > > think of a way to transform rotations around an arbitrary axis to
> their
> > > > correspoding transformation angles around x,y,z axis that also is I
> > assume
> > > > possible...
> > > > >
> > > > >
> > > > > On Tue, Apr 29, 2008 at 7:37 PM, Sina Türeli <[EMAIL PROTECTED]
> >
> > wrote:
> > > > >
> > > > > >
> > > > > >
> > > > > > Ok, for a certain program I am writing (protein folding), I need
> to
> > be
> > > > able perform rotations. I was first planning to do it manually by
> > defining
> > > > rotation matrices and change of basis matrices etc but I think pdl
> might
> > > > save me time. However I am not sure how to use its use PDL::Transform
> to
> > do
> > > > so. Here is a piece of code that I was using to experiment with pdl
> use
> > PDL;
> > > > > > use PDL::Transform;
> > > > > >
> > > > > > @a = [[1,0,0],[0,1,0],[0,0,1]];
> > > > > >
> > > > > > $c= pdl @a;
> > > > > >
> > > > > > $e = t_rot(45,45,45);
> > > > > >
> > > > > > $c = $e * $c
> > > > > >
> > > > > > print $c;
> > > > > >
> > > > > > I was hoping this would rotate my 1,1,1 vector in all directions
> by
> > 45
> > > > degrees but it gives the error. "Hash given as a pdl - but not {PDL}
> > key!".
> > > > I am not able to understand what this error is for? Also I have seen
> no
> > > > tutorial where these rotationa matrices are explained so I would
> > appreciate
> > > > any help, thanks.
> > > > > >
> > > > > > --
> > > > > > "Vectors have never been of the slightest use to any creature.
> > > > Quaternions came from Hamilton after his really good work had been
> done;
> > and
> > > > though beautifully ingenious, have been an unmixed evil to those who
> > have
> > > > touched them in any way, including Maxwell." - Lord Kelvin
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > "Vectors have never been of the slightest use to any creature.
> > Quaternions
> > > > came from Hamilton after his really good work had been done; and
> though
> > > > beautifully ingenious, have been an unmixed evil to those who have
> > touched
> > > > them in any way, including Maxwell." - Lord Kelvin
> > > > >
> > > > > _______________________________________________
> > > > >
> > > > > Perldl mailing list
> > > > > Perldl@jach.hawaii.edu
> > > > > http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
> > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > "Vectors have never been of the slightest use to any creature.
> > Quaternions
> > > > came from Hamilton after his really good work had been done; and
> though
> > > > beautifully ingenious, have been an unmixed evil to those who have
> > touched
> > > > them in any way, including Maxwell." - Lord Kelvin
> > > >
> > > > _______________________________________________
> > > >  Perldl mailing list
> > > >  Perldl@jach.hawaii.edu
> > > >  http://mailman.jach.hawaii.edu/mailman/listinfo/perldl
> > > >
> > > >
> > >
> >
> >
> >
> > --
> >
> >  "Vectors have never been of the slightest use to any creature.
> Quaternions
> > came from Hamilton after his really good work had been done; and though
> > beautifully ingenious, have been an unmixed evil to those who have
> touched
> > them in any way, including Maxwell." - Lord Kelvin
>



-- 
"Vectors have never been of the slightest use to any creature. Quaternions
came from Hamilton after his really good work had been done; and though
beautifully ingenious, have been an unmixed evil to those who have touched
them in any way, including Maxwell." - Lord Kelvin
_______________________________________________
Perldl mailing list
Perldl@jach.hawaii.edu
http://mailman.jach.hawaii.edu/mailman/listinfo/perldl

Reply via email to