--------------------------------------------------------- lines 8-167 of file: include/cppad/speed/det_of_minor.hpp --------------------------------------------------------- {xrst_begin det_of_minor} Determinant of a Minor ###################### Syntax ****** | ``# include `` | *d* = ``det_of_minor`` ( *a* , *m* , *n* , *r* , *c* ) Prototype ********* {xrst_literal // BEGIN_DET_OF_MINOR // END_DET_OF_MINOR } Inclusion ********* The template function ``det_of_minor`` is defined in the ``CppAD`` namespace by including the file ``cppad/speed/det_of_minor.hpp`` . Purpose ******* This template function returns the determinant of a minor of the matrix :math:`A` using expansion by minors. This template function is for example and testing purposes only. Expansion by minors is chosen as an example because it uses a lot of floating point operations yet does not require much source code (on the order of *m* factorial floating point operations and about 100 lines of source code including comments). This is not an efficient method for computing a determinant; for example, using an LU factorization would be faster. Minor ***** The elements of the :math:`n \times n` minor :math:`M` of the matrix :math:`A` are defined, for :math:`i = 0 , \ldots , n-1` and :math:`j = 0 , \ldots , n-1`, by .. math:: M_{i,j} = A_{R(i), C(j)} where the functions :math:`R(i)` is defined by the :ref:`argument r` and :math:`C(j)` is defined by the :ref:`argument c` . Determinant of A **************** If the following conditions hold, the minor is the entire matrix :math:`A` and hence ``det_of_minor`` will return the determinant of :math:`A`: #. :math:`n = m`. #. for :math:`i = 0 , \ldots , m-1`, :math:`r[i] = i+1`, and :math:`r[m] = 0`. #. for :math:`j = 0 , \ldots , m-1`, :math:`c[j] = j+1`, and :math:`c[m] = 0`. Scalar ****** This is the type of the elements of *a* . If *x* and *y* are *Scalar* objects, the type *Scalar* must support the following operations: .. csv-table:: :widths: auto **Syntax**,**Description**,**Result Type** *Scalar* (0),constructor for *Scalar* object equal to zero,*Scalar* *x* = *y*,set value of *x* to current value of *y* *x* + *y*,value of *x* plus *y*,*Scalar* *x* ``-`` *y*,value of *x* minus *y*,*Scalar* *x* * *y*,value of *x* times value of *y*,*Scalar* a * The elements of the :math:`m \times m` matrix :math:`A` are defined, for :math:`i = 0 , \ldots , m-1` and :math:`j = 0 , \ldots , m-1`, by .. math:: A_{i,j} = a[ i * m + j] m * This is the number of rows (and columns) in the square matrix :math:`A`. n * This is the number of rows (and columns) in the square minor :math:`M`. r * This defines the function :math:`R(i)` which specifies the rows of the minor :math:`M`. To be specific, the function :math:`R(i)` for :math:`i = 1, \ldots , n-1` is defined by .. math:: :nowrap: \begin{eqnarray} R(0) & = & r[m] \\ R(i) & = & r[ R(i-1) ] \end{eqnarray} All the elements of *r* have value less than or equal *m* ; :math:`R(i) < m` and :math:`r[ R(n-1) ] = m` . The elements of vector *r* are modified during the computation, and restored to their original value before the return from ``det_of_minor`` . c * This defines the function :math:`C(i)` which specifies the columns of the minor :math:`M`. To be specific, the function :math:`C(i)` for :math:`j = 1, \ldots , n-1` is defined by .. math:: :nowrap: \begin{eqnarray} C(0) & = & c[m] \\ C(j) & = & c[ C(j-1) ] \end{eqnarray} All the elements of *c* must have value less than or equal *m* ; :math:`C(j) < m` and :math:`c[ C(n-1) ] = m` . The elements of vector *c* are modified during the computation, and restored to their original value before the return from ``det_of_minor`` . d * The return value *d* is equal to the determinant of the minor :math:`M`. {xrst_toc_hidden speed/example/det_of_minor.cpp xrst/det_of_minor_hpp.xrst } Example ******* The file :ref:`det_of_minor.cpp-name` contains an example and test of ``det_of_minor.hpp`` . Source Code *********** The file :ref:`det_of_minor.hpp-name` contains the source for this template function. {xrst_end det_of_minor}