Re: [eigen] Transform.rotation() hang |
[ Thread Index |
Date Index
| More lists.tuxfamily.org/eigen Archives
]
- To: eigen@xxxxxxxxxxxxxxxxxxx
- Subject: Re: [eigen] Transform.rotation() hang
- From: "Schleimer, Ben" <bensch128@xxxxxxxxx>
- Date: Tue, 10 Feb 2009 17:05:42 -0800 (PST)
- Domainkey-signature: a=rsa-sha1; q=dns; c=nofws; s=s1024; d=yahoo.com; h=X-YMail-OSG:Received:X-Mailer:Date:From:Reply-To:Subject:To:In-Reply-To:MIME-Version:Content-Type:Message-ID; b=lnr+5iaqTaF2Aen+71Bb0kDe8izGC47CkSRlj8WVIMVtMi0vY/xyqkBan24vowvlMNON70GZELQjdaHNAnN532AlUIcAbhDM5p6ohw5dPhqfC4M5tlN5MbW5YZ+ubQ1w/2o0n+nBCt/ZFOis752nywgPEJE6hfl03qpzqqK8Cgk=;
It seems to me to be more useful and powerful to have a general map(Functor) for a matrix then write special case coeff-wise methods.
It make also make some of the uses of cwise more understandable.
template <typename T>
struct Truncator {
const T mVal;
Truncator(const T& v) : mVal(v) {}
T operator()(const T& in) const { return mVal<=in ? in: T(); }
}
Matrix4f m << some matrix...;
Truncator f(m.norm());
m = m.map<Truncator>(f);
It might be easier to do some of the cwise operations this way
(like comparisons, "m.cwise() <= m2" seems odd)
Of course, I don't know if this would work for vectorization
just my $0.02
Ben
--- On Tue, 2/10/09, Keir Mierle <mierle@xxxxxxxxx> wrote:
> From: Keir Mierle <mierle@xxxxxxxxx>
> Subject: Re: [eigen] Transform.rotation() hang
> To: eigen@xxxxxxxxxxxxxxxxxxx
> Date: Tuesday, February 10, 2009, 5:03 PM
> I suspect a .truncate() function would be generally useful.
>
> Matrix... M;
> M.truncate()
> M.clampSmallValues()
> M.truncateNegligible()
> M.? Other ideas?
>
> Keir
>
> On Tue, Feb 10, 2009 at 1:01 PM, Benoit Jacob
> <jacob.benoit.1@xxxxxxxxx>wrote:
>
> > Meanwhile, here are some thoughts if you absolutely
> have to live with
> > the current SVD.
> >
> > What I can see on your matrices, is that while their
> norm is (of the
> > order of magnitude of) 1, they have some coefficients
> of the order of
> > magnitude of 1e-300. That could easily be what
> triggers a bug in the
> > current SVD.
> >
> > So one thing you can do, before calling the SVD (i.e.
> before calling
> > rotation()) is to:
> > 1) compute N = matrix.norm()
> > 2) for each entry matrix(i,j),
> > if(ei_isMuchSmallerThan(matrix(i,j), N))
> > matrix(i,j) = 0;
> >
> > Cheers,
> > Benoit
> >
> > 2009/2/10 Ben Axelrod <baxelrod@xxxxxxxxxxxx>:
> > > Sometimes calling Eigen::Transform.rotation()
> hangs and does not return.
> > >
> > >
> > >
> > > This transform matrix runs fine:
> > >
> > > 1 0 -1.931e-312 1
> > >
> > > 0 1 0 0
> > >
> > > 1.931e-312 0 1 1.5
> > >
> > > 0 0 0 1
> > >
> > >
> > >
> > > This transform matrix hangs:
> > >
> > > 1 0 -2.357e-312 1
> > >
> > > 0 1 0 0
> > >
> > > 1.179e-311 0 5 7.5
> > >
> > > 0 0 0 1
> > >
> > >
> > >
> > >
> > >
> > > Any help?
> > >
> > >
> > >
> > > Detailed info: the transforms were computed by:
> > >
> > >
> > >
> > > Tf * Tr * Qt * Sc
> > >
> > >
> > >
> > > Where, for the good transform:
> > >
> > >
> > >
> > > Tf = Transform:
> > >
> > > 1 0 0 1
> > >
> > > 0 1 0 0
> > >
> > > 0 0 1 0
> > >
> > > 0 0 0 1
> > >
> > >
> > >
> > > Tr = Translation:
> > >
> > > 0
> > >
> > > 0
> > >
> > > 1.5
> > >
> > >
> > >
> > > Qt = Quaternion:
> > >
> > > 0
> > >
> > > -9.653e-313
> > >
> > > 0
> > >
> > > 1
> > >
> > >
> > >
> > > Sc = Scaling:
> > >
> > > 1
> > >
> > > 1
> > >
> > > 1
> > >
> > >
> > >
> > >
> > >
> > > And for the bad transform:
> > >
> > >
> > >
> > > Tf = Transform:
> > >
> > > 1 0 0 1
> > >
> > > 0 1 0 0
> > >
> > > 0 0 5 0
> > >
> > > 0 0 0 1
> > >
> > >
> > >
> > > Tr = Translation:
> > >
> > > 0
> > >
> > > 0
> > >
> > > 1.5
> > >
> > >
> > >
> > > Qt = Quaternion:
> > >
> > > 0
> > >
> > > -1.179e-312
> > >
> > > 0
> > >
> > > 1
> > >
> > >
> > >
> > > Sc = Scaling:
> > >
> > > 1
> > >
> > > 1
> > >
> > > 1
> > >
> > >
> > >
> > >
> > >
> > > Thanks,
> > >
> > > -Ben
> >
> >
> >