Bullet Collision Detection & Physics Library: btImplicitQRSVD.h File Reference

Bullet Collision Detection & Physics Library

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

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
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
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
void | polarDecomposition (const btMatrix2x2 &A, GivensRotation &R, const btMatrix2x2 &S_Sym)
| 2x2 polar decomposition.
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'
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'
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
template<int t>
void | process (btMatrix3x3 &B, btMatrix3x3 &U, btVector3 &sigma, btMatrix3x3 &V)
| Helper function of 3X3 SVD for processing 2X2 SVD.
void | flipSign (int i, btMatrix3x3 &U, btVector3 &sigma)
| Helper function of 3X3 SVD for flipping signs due to flipping signs of sigma.
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.
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'

## 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] | A | matrix.
  [out] | R | Robustly a rotation matrix.
  [out] | S_Sym | Symmetric. 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] | A | Input matrix.
  [out] | U | Robustly a rotation matrix.
  [out] | Sigma | Vector of singular values sorted with decreasing magnitude. The second one can be negative.
  [out] | V | Robustly 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] | A | Input matrix.
  [out] | U | Robustly a rotation matrix in Givens form
  [out] | Sigma | matrix of singular values sorted with decreasing magnitude. The second one can be negative.
  [out] | V | Robustly 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] | A | Input matrix.
  [out] | U | is a rotation matrix.
  [out] | sigma | Diagonal matrix, sorted with decreasing magnitude. The third one can be negative.
  [out] | V | is 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.