gtk-demo: Add some comments

Add some comments to the math in the transforms demo.
This commit is contained in:
Matthias Clasen 2020-09-06 08:42:27 -04:00
parent 8b38d1895c
commit 8c8baa9aa6
2 changed files with 60 additions and 1 deletions

View File

@ -63,11 +63,15 @@ unit_to (graphene_point3d_t *p1,
graphene_matrix_multiply (&s, &u, m); graphene_matrix_multiply (&s, &u, m);
} }
/* Make a 4x4 matrix that maps /* Compute a 4x4 matrix m that maps
* p1 -> q1 * p1 -> q1
* p2 -> q2 * p2 -> q2
* p3 -> q3 * p3 -> q3
* p4 -> q4 * p4 -> q4
*
* This is not in general possible, because projective
* transforms preserve coplanarity. But in the cases we
* care about here, both sets of points are always coplanar.
*/ */
void void
perspective_3d (graphene_point3d_t *p1, perspective_3d (graphene_point3d_t *p1,

View File

@ -11,6 +11,20 @@
#define MAX_ITERATION_COUNT 30 #define MAX_ITERATION_COUNT 30
/* Perform Householder reduction to bidiagonal form
*
* Input: Matrix A of size nrows x ncols
*
* Output: Matrices and vectors such that
* A = U*Bidiag(diagonal, superdiagonal)*Vt
*
* All matrices are allocated by the caller
*
* Sizes:
* A, U: nrows x ncols
* diagonal, superdiagonal: ncols
* V: ncols x ncols
*/
static void static void
householder_reduction (double *A, householder_reduction (double *A,
int nrows, int nrows,
@ -160,6 +174,20 @@ householder_reduction (double *A,
} }
} }
/* Perform Givens reduction
*
* Input: Matrices such that
* A = U*Bidiag(diagonal,superdiagonal)*Vt
*
* Output: The same, with superdiagonal = 0
*
* All matrices are allocated by the caller
*
* Sizes:
* U: nrows x ncols
* diagonal, superdiagonal: ncols
* V: ncols x ncols
*/
static int static int
givens_reduction (int nrows, givens_reduction (int nrows,
int ncols, int ncols,
@ -298,6 +326,11 @@ givens_reduction (int nrows,
return 0; return 0;
} }
/* Given a singular value decomposition
* of an nrows x ncols matrix A = U*Diag(S)*Vt,
* sort the values of S by decreasing value,
* permuting V to match.
*/
static void static void
sort_singular_values (int nrows, sort_singular_values (int nrows,
int ncols, int ncols,
@ -339,6 +372,16 @@ sort_singular_values (int nrows,
} }
} }
/* Compute a singular value decomposition of A,
* A = U*Diag(S)*Vt
*
* All matrices are allocated by the caller
*
* Sizes:
* A, U: nrows x ncols
* S: ncols
* V: ncols x ncols
*/
int int
singular_value_decomposition (double *A, singular_value_decomposition (double *A,
int nrows, int nrows,
@ -364,6 +407,18 @@ singular_value_decomposition (double *A,
return 0; return 0;
} }
/*
* Given a singular value decomposition of A = U*Diag(S)*Vt,
* compute the best approximation x to A*x = B.
*
* All matrices are allocated by the caller
*
* Sizes:
* U: nrows x ncols
* S: ncols
* V: ncols x ncols
* B, x: ncols
*/
void void
singular_value_decomposition_solve (double *U, singular_value_decomposition_solve (double *U,
double *S, double *S,