Bullet Collision Detection & Physics Library
Classes | Functions
btImplicitQRSVD.h File Reference
#include <limits>
#include "btMatrix3x3.h"
Include dependency graph for btImplicitQRSVD.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  btMatrix2x2
 Bullet Continuous Collision Detection and Physics Library Copyright (c) 2019 Google Inc. More...
 
class  GivensRotation
 Class for givens rotation. More...
 

Functions

static btScalar copySign (btScalar x, btScalar y)
 
void zeroChase (btMatrix3x3 &H, btMatrix3x3 &U, btMatrix3x3 &V)
 zero chasing the 3X3 matrix to bidiagonal form original form of H: x x 0 x x x 0 0 x after zero chase: x x 0 0 x x 0 0 x More...
 
void makeUpperBidiag (btMatrix3x3 &H, btMatrix3x3 &U, btMatrix3x3 &V)
 make a 3X3 matrix to upper bidiagonal form original form of H: x x x x x x x x x after zero chase: x x 0 0 x x 0 0 x More...
 
void makeLambdaShape (btMatrix3x3 &H, btMatrix3x3 &U, btMatrix3x3 &V)
 make a 3X3 matrix to lambda shape original form of H: x x x x x x x x x after : x 0 0 x x 0 x 0 x More...
 
void polarDecomposition (const btMatrix2x2 &A, GivensRotation &R, const btMatrix2x2 &S_Sym)
 2x2 polar decomposition. More...
 
void polarDecomposition (const btMatrix2x2 &A, const btMatrix2x2 &R, const btMatrix2x2 &S_Sym)
 
void singularValueDecomposition (const btMatrix2x2 &A, GivensRotation &U, const btMatrix2x2 &Sigma, GivensRotation &V, const btScalar tol=64 *std::numeric_limits< btScalar >::epsilon())
 2x2 SVD (singular value decomposition) A=USV' More...
 
void singularValueDecomposition (const btMatrix2x2 &A, const btMatrix2x2 &U, const btMatrix2x2 &Sigma, const btMatrix2x2 &V, const btScalar tol=64 *std::numeric_limits< btScalar >::epsilon())
 2x2 SVD (singular value decomposition) A=USV' More...
 
btScalar wilkinsonShift (const btScalar a1, const btScalar b1, const btScalar a2)
 compute wilkinsonShift of the block a1 b1 b1 a2 based on the wilkinsonShift formula mu = c + d - sign (d) \ sqrt (d*d + b*b), where d = (a-c)/2 More...
 
template<int t>
void process (btMatrix3x3 &B, btMatrix3x3 &U, btVector3 &sigma, btMatrix3x3 &V)
 Helper function of 3X3 SVD for processing 2X2 SVD. More...
 
void flipSign (int i, btMatrix3x3 &U, btVector3 &sigma)
 Helper function of 3X3 SVD for flipping signs due to flipping signs of sigma. More...
 
void flipSign (int i, btMatrix3x3 &U)
 
void swapCol (btMatrix3x3 &A, int i, int j)
 
void sort (btMatrix3x3 &U, btVector3 &sigma, btMatrix3x3 &V, int t)
 Helper function of 3X3 SVD for sorting singular values. More...
 
int singularValueDecomposition (const btMatrix3x3 &A, btMatrix3x3 &U, btVector3 &sigma, btMatrix3x3 &V, btScalar tol=128 *std::numeric_limits< btScalar >::epsilon())
 3X3 SVD (singular value decomposition) A=USV' More...
 

Function Documentation

◆ copySign()

static btScalar copySign ( btScalar  x,
btScalar  y 
)
inlinestatic

Definition at line 90 of file btImplicitQRSVD.h.

◆ flipSign() [1/2]

void flipSign ( int  i,
btMatrix3x3 U 
)
inline

Definition at line 653 of file btImplicitQRSVD.h.

◆ flipSign() [2/2]

void flipSign ( int  i,
btMatrix3x3 U,
btVector3 sigma 
)
inline

Helper function of 3X3 SVD for flipping signs due to flipping signs of sigma.

Definition at line 645 of file btImplicitQRSVD.h.

◆ makeLambdaShape()

void makeLambdaShape ( btMatrix3x3 H,
btMatrix3x3 U,
btMatrix3x3 V 
)
inline

make a 3X3 matrix to lambda shape original form of H: x x x x x x x x x after : x 0 0 x x 0 x 0 x

Reduce H to of form x x 0 x x x x x x

Reduce H to of form x x 0 x x 0 x x x

Reduce H to of form x x 0 x x 0 x 0 x

Reduce H to of form x 0 0 x x 0 x 0 x

Definition at line 372 of file btImplicitQRSVD.h.

◆ makeUpperBidiag()

void makeUpperBidiag ( btMatrix3x3 H,
btMatrix3x3 U,
btMatrix3x3 V 
)
inline

make a 3X3 matrix to upper bidiagonal form original form of H: x x x x x x x x x after zero chase: x x 0 0 x x 0 0 x

Reduce H to of form x x x x x x 0 x x

Definition at line 342 of file btImplicitQRSVD.h.

◆ polarDecomposition() [1/2]

void polarDecomposition ( const btMatrix2x2 A,
const btMatrix2x2 R,
const btMatrix2x2 S_Sym 
)
inline

Definition at line 453 of file btImplicitQRSVD.h.

◆ polarDecomposition() [2/2]

void polarDecomposition ( const btMatrix2x2 A,
GivensRotation R,
const btMatrix2x2 S_Sym 
)
inline

2x2 polar decomposition.

Parameters
[in]Amatrix.
[out]RRobustly a rotation matrix.
[out]S_SymSymmetric. Whole matrix is stored

Polar guarantees negative sign is on the small magnitude singular value. S is guaranteed to be the closest one to identity. R is guaranteed to be the closest rotation to A.

Definition at line 431 of file btImplicitQRSVD.h.

◆ process()

template<int t>
void process ( btMatrix3x3 B,
btMatrix3x3 U,
btVector3 sigma,
btMatrix3x3 V 
)
inline

Helper function of 3X3 SVD for processing 2X2 SVD.

Definition at line 592 of file btImplicitQRSVD.h.

◆ singularValueDecomposition() [1/3]

void singularValueDecomposition ( const btMatrix2x2 A,
const btMatrix2x2 U,
const btMatrix2x2 Sigma,
const btMatrix2x2 V,
const btScalar  tol = 64 * std::numeric_limits<btScalar>::epsilon() 
)
inline

2x2 SVD (singular value decomposition) A=USV'

Parameters
[in]AInput matrix.
[out]URobustly a rotation matrix.
[out]SigmaVector of singular values sorted with decreasing magnitude. The second one can be negative.
[out]VRobustly a rotation matrix.

Definition at line 549 of file btImplicitQRSVD.h.

◆ singularValueDecomposition() [2/3]

void singularValueDecomposition ( const btMatrix2x2 A,
GivensRotation U,
const btMatrix2x2 Sigma,
GivensRotation V,
const btScalar  tol = 64 * std::numeric_limits<btScalar>::epsilon() 
)
inline

2x2 SVD (singular value decomposition) A=USV'

Parameters
[in]AInput matrix.
[out]URobustly a rotation matrix in Givens form
[out]Sigmamatrix of singular values sorted with decreasing magnitude. The second one can be negative.
[out]VRobustly a rotation matrix in Givens form

Definition at line 469 of file btImplicitQRSVD.h.

◆ singularValueDecomposition() [3/3]

int singularValueDecomposition ( const btMatrix3x3 A,
btMatrix3x3 U,
btVector3 sigma,
btMatrix3x3 V,
btScalar  tol = 128*std::numeric_limits<btScalar>::epsilon() 
)
inline

3X3 SVD (singular value decomposition) A=USV'

Parameters
[in]AInput matrix.
[out]Uis a rotation matrix.
[out]sigmaDiagonal matrix, sorted with decreasing magnitude. The third one can be negative.
[out]Vis a rotation matrix.

Do implicit shift QR until A^T A is block diagonal

Handle the cases of one of the alphas and betas being 0 Sorted by ease of handling and then frequency of occurrence

If B is of form x x 0 0 x 0 0 0 x

If B is of form x 0 0 0 x x 0 0 x

If B is of form x x 0 0 0 x 0 0 x

Reduce B to x x 0 0 0 0 0 0 x

If B is of form x x 0 0 x x 0 0 0

Reduce B to x x + 0 x 0 0 0 0

Reduce B to x x 0

  • x 0 0 0 0

If B is of form 0 x 0 0 x x 0 0 x

Reduce B to 0 0 + 0 x x 0 0 x

Reduce B to 0 0 0 0 x x 0 + x

Definition at line 750 of file btImplicitQRSVD.h.

◆ sort()

void sort ( btMatrix3x3 U,
btVector3 sigma,
btMatrix3x3 V,
int  t 
)
inline

Helper function of 3X3 SVD for sorting singular values.

Definition at line 668 of file btImplicitQRSVD.h.

◆ swapCol()

void swapCol ( btMatrix3x3 A,
int  i,
int  j 
)
inline

Definition at line 660 of file btImplicitQRSVD.h.

◆ wilkinsonShift()

btScalar wilkinsonShift ( const btScalar  a1,
const btScalar  b1,
const btScalar  a2 
)
inline

compute wilkinsonShift of the block a1 b1 b1 a2 based on the wilkinsonShift formula mu = c + d - sign (d) \ sqrt (d*d + b*b), where d = (a-c)/2

Definition at line 572 of file btImplicitQRSVD.h.

◆ zeroChase()

void zeroChase ( btMatrix3x3 H,
btMatrix3x3 U,
btMatrix3x3 V 
)
inline

zero chasing the 3X3 matrix to bidiagonal form original form of H: x x 0 x x x 0 0 x after zero chase: x x 0 0 x x 0 0 x

Reduce H to of form x x + 0 x x 0 0 x

Reduce H to of form x x 0 0 x x 0 + x Can calculate r2 without multiplying by r1 since both entries are in first two rows thus no need to divide by sqrt(a^2+b^2)

Reduce H to of form x x 0 0 x x 0 0 x

Definition at line 286 of file btImplicitQRSVD.h.